2017-02-14 75 views
2

我感兴趣的是有没有办法避免Django ModelForm和Django Model之间的重复。 例如我有这个简单的模型:避免在Django ModelForm和Django Model之间重复使用

class Category(models.Model): 
    name = models.CharField(max_length=128) 

和相应的ModelForm它

class CategoryForm(forms.ModelForm): 
    name = models.CharField(max_length=128) 
    class Meta: 
     model = Category 
     fields = ('name',) 

正如我们可以看到有这些实体之间的重复。此代码

max_length=128 

- 它违反了“不要重复自己”的原则吗?
如果违反,我们如何避免代码的重复?

+1

第二个类是从'Model'而不是'ModelForm'继承的,是一个错字?你也不需要明确定义'ModelForm'中的字段。 – yedpodtrzitko

+0

是的,这是一个错字。我修好了。请原谅。现在应该没问题。 –

回答

0

正如其他的答案中指出,你不需要重新申报中的ModelForm中的字段。你只需要在Meta类的fields属性中列出它们。如果你觉得这不够干燥。您可以使用__all__

设置字段属性的特殊价值“所有”表明 该模型中的所有字段应该使用。例如:

价:https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/

1

但是您不必在您的案例中再次指定name字段。

您正在使用ModelForm,因此在Meta中只定义了模型,该模型被称为此Form和Fields,应该在Form中使用。 Django将为您提取小部件并构建表单。

所以这是不够

class CategoryForm(forms.ModelForm): 
    class Meta: 
     model = Category 
     fields = ('name',) 
0

--model

class Category(models.Model): 
    name = models.CharField(max_length=128) 

- 形式

class CategoryForm(forms.ModelForm): 
    class Meta: 
    model = Category 
    fields = ('name',) 

-View

class CategoryView(request): 
    form = CategoryForm() 
    if request.method == "POST": 
     #code.. 
     return render(request,'htmlpage.html',{Variables: Variables}) 
    else: 
     return render(request, "htmlpage.html",{'form':form}) 

创建'表单',查看页面加载。这里来自html页面的请求用POST进行查询。如果帖子没有被请求,FORM模板被发送到html页面。