代码之家  ›  专栏  ›  技术社区  ›  shanyu

字段和基本字段-Django

  •  10
  • shanyu  · 技术社区  · 16 年前

    创建flatpage时,我希望用户从预定义列表中选择模板。为了保持 Flatpage ChoiceField ModelChoiceField (后者提供模板的主键,但我需要模板名称字段的名称):

    class NewFlatpageForm(FlatpageForm):
    
        template_name = forms.ChoiceField(choices = [])
        def __init__(self, *args, **kwargs):
            self.base_fields['template_name'].choices = ProjectTemplate.objects.values_list('path', 'name')
            super(NewFlatpageForm, self).__init__(*args, **kwargs)
    

    我凌驾 __init__

    fields 不使用admin时的属性。然而,在这种情况下,我得到了一个例外告诉 不是窗体的属性。 __dict__ 告诉我有一个 base_fields 领域

    3 回复  |  直到 16 年前
        1
  •  13
  •   Daniel Roseman    16 年前

    fields 不存在,直到 之后 你打过电话 super . 所以只需交换行的顺序,这样 超级的 第一位。

        2
  •  10
  •   djvg Carl Meyer    4 年前

    我自己的经验教训:修改 base_fields 这意味着您的修改将“永远”保留(直到python退出)。在您的情况下,这可能不是问题,因为您总是使用相同的字段名,并且您正在使用ProjectTemplate中的赋值替换其值。。。

    super 早期(如此处所示),然后对 self.fields self.base_fields ,我能够消除不断增加的字段列表的问题。现在这很有道理,但我对所有语法细节都不熟悉,所以我没有试图先理解它,而是进行了破解。

        3
  •  4
  •   Rune Kaagaard    14 年前

    def get_form(self, request, obj=None, **kwargs):
        form = super(ResourceAdmin, self).get_form(request, obj, **kwargs)
        form = copy.deepcopy(form)
    
        if obj:
            form.base_fields['email'] = EmailField(initial=obj.user.email)
        if not request.user.is_superuser:
            form.base_fields['user'].widget = HiddenInput(attrs={'class': 'hide_form_row'})
    
        return form