[英]Django: OneToOne self-referencing field form validation error (Model with this field already exists)
各位大佬能指点一下吗。。
我刚刚在 model 中创建了一个指向自身的 onetoone 字段。 当我尝试编辑已经创建的 model 时,我在表单验证中遇到了冲突问题,该字段已经填充了与从头开始分配的相同实例的 onetoone 字段。 如果我在字段中保持相同的关系(之前分配的实例),它将返回错误:“ Model (我的模型名称)与此字段(我的字段名称)已经存在”但是如果我将表单中的字段值更改为另一个例如,它最终会毫无问题地验证此表单。 因此,我想到的解决方案是覆盖表单中的验证/清理方法。 这是处理这个问题的正确方法吗? 如果这是真的那么如何编写适当的代码来处理这种情况?
为了清楚起见,我在下面附上了我的代码:
模型.py
db_dr = models.OneToOneField('self', on_delete=models.CASCADE, blank=True, null=True)
views.py中的部分代码
form = DatabaseInfoForm(initial=data)
if request.method == 'POST':
form = DatabaseInfoForm(request.POST)
if form.is_valid():
你没有输入完整的代码来寻求帮助,所以这里有一个例子,假设你有两个模型员工和公司:
class Employee(models.Model):
name = models.CharField(max_length=25)
created_name = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
class Company(models.Model):
employee = models.OneToOneField(Employee, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
direction = models.CharField(max_length=80)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
假设您已经创建了员工表单,我们将只创建公司表单:
class CompanyForm(ModelForm):
class Meta:
model = Company
fields = (
'employee', 'name', 'direction',
)
已经有了公司模型和forms,只需要创建视图,首先我们从创建开始:
def company_creation(request):
template_name = 'your template'
form = CompanyForm(request.POST)
if request.method == 'POST' and form.is_valid():
form.save()
return redirect('your url')
return render(request, template_name, {
'form': form,
})
然后我们创建修改视图:
def company_edit(request, pk):
template_name = 'your template'
# here we get the data we want to modify
company = Company.objects.get(pk=pk)
form = CompanyForm(request.POST, instance=company)
if request.method == 'POST' and form.is_valid():
form.save()
return redirect('your url')
return render(request, template_name, {
'form': form,
})
最后我们只创建 url:
app_name = 'company'
urlpatterns = [
path('create/', views.company_creation, name='create'),
path('edit/<pk>/', views.company_edit, name='edit'),
]
这样创建和编辑,没有任何问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.