Динамическая форма поля в __init__in администратора Django - PullRequest
2 голосов
/ 22 июля 2011

Моя модель и форма:

#admin.py
class SitesForm(forms.ModelForm):

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

        self.fields['mynewfield'] = forms.CharField()

class SitesAdmin(admin.ModelAdmin):
    form = SitesForm

admin.site.register(Sites,SitesAdmin)

#model.py
class Sites(models.Model):
    url = models.URLField(u'URL')
    is_active = models.BooleanField(default=True, blank=True)
    is_new = models.BooleanField(default=False, blank=True)
    group = models.ForeignKey('SitesGroup')
    config = models.TextField(blank=True)

Поле 'mynewfield' не отображается в форме.Почему?

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Вы не должны добавлять новое поле в форму таким образом, вы можете просто сделать это так же, как любое другое поле, и форма будет содержать как исходные поля модели, так и ваши новые поля:

class SitesForm(forms.ModelForm):
  mynewfield = forms.CharField(max_length=255, blank=True)

  class Meta:
    model = Sites

class SitesAdmin(admin.ModelAdmin):
  form = SitesForm

admin.site.register(Sites, SitesAdmin)

Редактировать : Извините, должен был прочитать то, что вы написали немного лучше.Если вам нужно такое поле dynamic , то вам нужно сделать следующее, и оно будет делать именно то, что вы хотите:

class SitesForm(forms.ModelForm):
  class Meta:
    model = Sites

  def __init__(self, *args, **kwargs):
    self.base_fields['mynewfield'] = forms.CharField(max_length=255, blank=True)
    super(SitesForm, self).__init__(*args, **kwargs)

class SitesAdmin(admin.ModelAdmin):
  form = SitesForm

admin.site.register(Sites, SitesAdmin)

Это базовые поля, которые создаются метаклассом, которыйсодержит поля, которые будет использовать форма.

1 голос
/ 23 июля 2011

Решение:

class AdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(AdminForm, self).__init__(*args, **kwargs)
        self.fields.insert(1, 'myfield', forms.CharField())

class MyAdmin(admin.ModelAdmin):
    form = AdminForm

    def get_fieldsets(self, request, obj=None):
        return (
            (None, {
                'fields': (..., 'myfield',),
            }),
        )
...