gpt4 book ai didi

python - 具有独特字段的 Django UpdateView

转载 作者:行者123 更新时间:2023-12-01 07:22:07 25 4
gpt4 key购买 nike

有没有办法在更新 View 中更新唯一字段?我有一个具有 nameage 字段的模型,但是当我尝试更新 age 时甚至不更改 的值name,它返回一个错误,该名称已存在于数据库中

模型.py

class MyModel(models.Model)
name = models.CharField(max_length=200, unique=True)
age = models.IntegerField()

View .py

class MyModelUpdateView(UpdateView):
def get(self):
self.object = self.get_object()
my_model = self.object

form = MyModelForm(instance=my_model)

return self.render_to_response(
self.get_context_data(pk=my_model.pk, form=form)
)

def post(self, request, *args, **kwargs):
self.object = self.get_object()

my_model = self.object

form = MyModelForm(data=request.POST, instance=my_model)

if form.is_valid():
form.save()

return some_url

return self.render_to_response(
self.get_context_data(pk=my_model.pk, form=form)
)

表单.py

class MyModelForm(forms.ModelForm):

class Meta:
model = MyModel
fields = (
'name',
'age',
)

def clean(self):
cleaned_data = super().clean()

if MyModel.objects.filter(
active=True, name=cleaned_data.get('name')
).exists():
raise forms.ValidationError('MyModel already exists.')

return cleaned_data

我在这里缺少什么?谢谢。

最佳答案

由于您更新了模型,并且没有更改名称,因此具有该名称的记录当然已经存在:特定记录。因此,您应该将检查代码更改为:

class MyModelForm(forms.ModelForm):

def clean(self, *args, **kwargs):
cleaned_data = super().clean(*args, **kwargs)
if MyModel.objects.<b>exclude(pk=self.instance.pk)</b>.filter(
active=True, name=cleaned_data.get('name')
).exists():
raise forms.ValidationError('MyModel already exists.')
return cleaned_data

class Meta:
model = MyModel
fields = ('name', 'age')

不要改变UpdateView的样板逻辑,您可以通过以下方式轻松实现:

class MyModelUpdateView(UpdateView):
<b>form_class = MyModelForm</b>
success_url = <i>'some url'</i>

话虽这么说,因为如果您已经将该字段设置unique=True,则无需自己实现检查。在这里,您似乎已经拥有一个unique=True约束:

class MyModel(models.Model)
name = models.CharField(max_length=200, <b>unique=True</b>)
age = models.IntegerField()

在这种情况下,您可以简单地让 ModelForm 完成工作,因此您的表单如下所示:

class MyModelForm(forms.ModelForm):

class Meta:
model = MyModel
fields = ('name', 'age')

只有当您想要更复杂的唯一性(例如 active=True?),并且您无法(轻松)表示它时,您才应该进行自己的验证。

关于python - 具有独特字段的 Django UpdateView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57648603/

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