use*_*156 4 forms django customization
我正在尝试创建一个自定义清理方法,如果一个特定数据的值已经存在,则查看数据库,如果是,则会引发错误.我正在使用继承自其他类(项目)的类(子系统)的模型形式.当我尝试在表单中添加新的sybsystem时,我想检查sybsystem是否已经存在.
我在视图函数中获取项目名称.
class SubsytemForm(forms.ModelForm):
class Meta:
model = Subsystem
exclude = ('project_name')
def clean(self,project_name):
cleaned_data = super(SubsytemForm, self).clean(self,project_name)
form_subsystem_name = cleaned_data.get("subsystem_name")
Subsystem.objects.filter(project__project_name=project_name)
subsystem_objects=Subsystem.objects.filter(project__project_name=project_name)
nb_subsystem = subsystem_objects.count()
for i in range (nb_subsystem):
if (subsystem_objects[i].subsystem_name==form_subsystem_name):
msg = u"Subsystem already existing"
self._errors["subsystem_name"] = self.error_class([msg])
# These fields are no longer valid. Remove them from the
# cleaned data.
del cleaned_data["subsystem_name"]
return cleaned_data
Run Code Online (Sandbox Code Playgroud)
我的观点功能:
def addform(request,project_name):
if form.is_valid():
form=form.save(commit=False)
form.project_id=Project.objects.get(project_name=project_name).id
form.clean(form,project_name)
form.save()
Run Code Online (Sandbox Code Playgroud)
这不起作用,我不知道该怎么办.我有错误:clean()需要2个参数(给定1个)
我的模特:
class Project(models.Model):
project_name = models.CharField("Project name", max_length=20)
Class Subsystem(models.Model):
subsystem_name = models.Charfield("Subsystem name", max_length=20)
projects = models.ForeignKey(Project)
Run Code Online (Sandbox Code Playgroud)
Dan*_*man 11
这段代码有很多问题.
首先,你不应该clean
明确地打电话.当您打电话时,Django会自动为您完成form.is_valid()
.因为它是自动完成的,所以你不能传递额外的参数.在实例化表单时需要传入参数,并将其保存为干净代码可以引用的实例变量.
其次,代码实际上只验证单个字段.所以应该用一种特定的clean_fieldname
方法来完成- 即clean_subsystem_name
.这避免了在最后混淆_errors
和删除不需要的数据的需要.
第三,如果你发现自己得到一些东西,迭代一个范围,然后使用该索引指回原始列表,你做错了.在Python中,你应该总是迭代你感兴趣的实际内容 - 在本例中是查询集.但是,在这种情况下无论如何都是无关紧要的,因为你应该直接在数据库中查询实际名称并检查是否它存在,而不是通过检查匹配迭代.
所以,把它们放在一起:
class SubsytemForm(forms.ModelForm):
class Meta:
model = Subsystem
exclude = ('project_name')
def __init__(self, *args, **kwargs):
self.project_name = kwargs.pop('project_name', None)
super(SubsystemForm, self).__init__(*args, **kwargs)
def clean_subsystem_name(self):
form_subsystem_name = self.cleaned_data.get("subsystem_name")
existing = Subsystem.objects.filter(
project__project_name=self.project_name,
subsytem_name=form_subsystem_name
).exists()
if existing:
raise forms.ValidationError(u"Subsystem already existing")
return form_subsystem_name
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3760 次 |
最近记录: |