Поле ModelForm включено, даже если не в полях - PullRequest
0 голосов
/ 22 октября 2019

У меня есть следующая модель:

class Test(models.Model):
    name = models.CharField(max_length=100)

И админ:

class TestForm(forms.ModelForm):
    confirm_name = forms.CharField(max_length=100)
...

@admin.register(Test)
class TestAdmin(admin.ModelAdmin):
    form = TestForm
    fields = ('name',)
    create_fields = ('name', 'confirm_name')

    def get_fields(self, request, obj=None):
        fields = super().get_fields(request, obj)

        if not obj:
            fields = self.create_fields

        return fields

Все отлично работает. Но когда вы добавляете запись, а затем пытаетесь редактировать ее, я получаю сообщение об ошибке «Пожалуйста, исправьте ошибку ниже». без каких-либо ошибок в поле. Я проверил ошибки формы и там написано, что имя_фирмы не должно быть пустым. Почему он все еще включен, если он не добавлен в полях ?

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Поле для формы администратора от TestForm

class TestForm(forms.ModelForm):
    confirm_name = forms.CharField(max_length=100)

Вы можете использовать:

class CreateTestForm(forms.ModelForm):
    confirm_name = forms.CharField(max_length=100)

    class Meta:
        model = Model
        field = ('name', 'confirm_name')

class UpdateTestForm(forms.ModelForm):

    class Meta:
        model = Model
        field = ('name',)

@admin.register(Test)
class TestAdmin(admin.ModelAdmin):

    def get_form(self, request, obj=None, change=False, **kwargs):
        if obj:
            kwargs['form'] = UpdateTestForm
        else:
            kwargs['form'] = CreateTestForm
        return super().get_form(request, obj, change, **kwargs)
0 голосов
/ 22 октября 2019

Вам нужно использовать add_form вместо get_fields.

В вашем примере

class CreateTestForm(forms.ModelForm):
    name = models.CharField(max_length=100)
    confirm_name = models.CharField(max_length=100)
    #.... your validation logic 

class UpdateTestForm(forms.ModelForm):
    name = models.CharField(max_length=100)

и в ваших admin.py


@admin.register(Test)
class TestAdmin(admin.ModelAdmin):
    form = TestForm
    add_form = CreateTest

    def get_form(self, request, obj=None, **kwargs):
        """
        Use special form during test creation
        """
        defaults = {}
        if obj is None:
            defaults['form'] = self.add_form
        defaults.update(kwargs)
        return super().get_form(request, obj, **defaults)

Кредитахот django.contrib.auth.admin

...