Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 即使不在字段中,也包括ModelForm字段_Django_Django Forms_Django Admin - Fatal编程技术网

Django 即使不在字段中,也包括ModelForm字段

Django 即使不在字段中,也包括ModelForm字段,django,django-forms,django-admin,Django,Django Forms,Django Admin,我有以下型号: 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

我有以下型号:

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

一切正常。但是,当您添加一条记录,然后尝试编辑它时,我会得到错误“请更正下面的错误”,而不显示任何字段错误。我检查了表单错误,它说确认名称不应该为空。如果未添加到字段中,为什么仍包含它?

您需要使用
add\u form
而不是
get\u fields

在你的例子中

class CreateTestForm(forms.ModelForm):
name=models.CharField(最大长度=100)
确认\u name=models.CharField(最大长度=100)
#.... 您的验证逻辑
类UpdateTestForm(forms.ModelForm):
name=models.CharField(最大长度=100)
在您的
admin.py


@管理员注册(测试)
类TestAdmin(admin.ModelAdmin):
form=TestForm
add_form=CreateTest
def get_表单(自我、请求、obj=None、**kwargs):
"""
在测试创建期间使用特殊表单
"""
默认值={}
如果obj为无:
默认值['form']=self.add\u表单
默认值。更新(kwargs)
return super().get_表单(请求、对象、**默认值)

管理员表单的

字段中的学分来自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)

因为它是表单的一个字段。你可能想用它来确认一下。如果要使其成为可选的,可以在
forms.CharField(..)
中写入
required=False
,但这会使该字段成为非必需字段,用户可以忽略它。这是一个必填字段。所以您希望在创建时使用它,而在编辑时不使用它吗?完全正确。创建时,您必须输入两次名称以避免错误。谢谢!我本想给你们投票,但我是新来的,还不能投票。