3

管理者のModelFormで以前に選択したアイテムを引き継ぐのに問題があります。このユースケースで最も簡単なUIであるため、 forms.CheckboxSelectMultipleウィジェットを使用したいと思います。保存時に値が保存される限り機能します。ただし、以前に保存されたアイテムを編集する場合、このフィールドに以前に保存された値はウィジェットに反映されません。

UIの例:

代替テキスト

投稿後(そのアイテムを編集し、空白で返します):

代替テキスト

ただし、ウィジェットを使用せず、アイテムを編集するときに通常のCharFieldを使用すると、次のようになります。

代替テキスト

それで、何らかの理由で、値はチェックボックスウィジェットによって表されませんか?

これが私の簡略化されたセットアップ、models.pyです

POST_TYPES = (
    ('blog',      'Blog'),
    ('portfolio',     'Portfolio'),
    ('beeldbank',     'Beeldbank'),
)

class Module(models.Model):
    title         =   models.CharField(max_length=100, verbose_name='title')        
    entriesFrom     =   models.CharField(max_length=100)

    def __unicode__(self):
       return self.title

forms.py:

class ModuleForm(forms.ModelForm):
    entriesFrom = forms.MultipleChoiceField(
            choices=POST_TYPES, 
            widget=CheckboxSelectMultiple, 
            label="Pull content from", 
            required=False,
            show_hidden_initial=True) 

    class Meta:
        model = Module

    def __init__(self, *args, **kwargs):
        super(ModuleForm, self).__init__(*args, **kwargs)

        if kwargs.has_key('instance'):
            instance = kwargs['instance']
            self.fields['entriesFrom'].initial = instance.entriesFrom

            logging.debug(instance.entriesFrom)

admin.py

class ModuleAdmin(admin.ModelAdmin):
    form = ModuleForm

したがって、「blog」などを選択して以前に保存したアイテムを編集すると、initでデバッグすると、self.fields ['entriesFrom']([u'blog'、])に正しい値が返されますが、チェックボックスには反映されません(何もありません)。管理者で選択済みとして表示されます)。

編集

ModuleFormクラスを更新して初期値を渡しますが、初期値( "[u'blog']")にいくつかの値がある間は、何も事前入力されません。

4

4 に答える 4

3

解決:

文字列ではなく整数で選択肢を設定します。

POST_TYPES = (
    (1,     'Blog'),
    (2,     'Portfolio'),
    (3,     'Beeldbank'),
)

くそー、それは私の頭蓋骨を壊す価値がなかった。

于 2010-10-05T09:51:12.400 に答える
2

正しくないかもしれませんが、私のユースケースでは、値を整数に置き換えたくありませんでした(受け入れられた答えに従って)。これは、試行錯誤の末、Djangoの内部を何度もステップスルーすることで実現しました。私にとってはうまくいきますが、YMMV:

from django.forms.widgets import (
    CheckboxSelectMultiple as OriginalCheckboxSelectMultiple,
)

class CheckboxSelectMultiple(OriginalCheckboxSelectMultiple):
    def optgroups(self, name, value, attrs=None):
        # values come back as e.g. `['foo,bar']`, which we don't want when inferring "selected"
        return super().optgroups(name, value[0].split(","), attrs)
于 2020-02-04T15:13:25.890 に答える
0

あなたの質問を完全には理解していないかもしれませんが、少し単純化できるようです。ModelFormsを使用すると、フォームの_init_をオーバーライドする必要はないと思います。これを試して、目的の動作が得られるかどうかを確認してください。

models.py

クラスModule(models.Model):
    POST_TYPES =(
        ('ブログ'、'ブログ')、
        ('ポートフォリオ'、'ポートフォリオ')、
    )。

    title = models.CharField(max_length = 100、verbose_name ='title')        
    entriesFrom = models.CharField(max_length = 100、verbose_name ='コンテンツをプルする'、choices = POST_TYPES、blank = True)

    def __unicode __(self):
       self.titleを返す

forms.py

クラスModuleForm(forms.ModelForm):
    クラスメタ:
        モデル=モジュール

admin.py

django.contribimportadminから
admin.site.register(models.Module)

私の答えがあなたが探しているものではない場合は、あなたの質問を明確にしてみてください。私があなたを助けることができるかどうかを確認します。

于 2010-10-04T21:34:38.070 に答える
0

この関数を使用して、文字列マークを削除できます

from ast import literal_eval

literal_eval(value)
于 2020-03-03T04:40:48.147 に答える