gpt4 book ai didi

Django : Validate data by querying the database in a model form (using custom clean method)

转载 作者:行者123 更新时间:2023-12-04 17:17:58 24 4
gpt4 key购买 nike

我正在尝试创建一个自定义清理方法,如果某个特定数据的值已经存在,并且如果是,则会在数据库中查找,如果是,则会引发错误。
我正在使用从其他类(项目)继承的类(子系统)的模型形式。
当我尝试在表单中添加一个新系统时,我想检查 sybsystem 是否已经存在。

我在我的 View 函数中得到了项目名称。

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

我的 View 功能:
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()

这不起作用,我不知道该怎么做。
我有错误: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)

最佳答案

这段代码有很多问题。

首先,您不应该显式调用 clean。当您调用 form.is_valid() 时,Django 会自动为您执行此操作。因为它是自动完成的,所以你不能传递额外的参数。您需要在实例化表单时传入参数,并将其保留为干净代码可以引用的实例变量。

其次,代码实际上只验证单个字段。所以它应该在特定的 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

关于Django : Validate data by querying the database in a model form (using custom clean method),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11579678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com