如何从某些表单中清除方法中的实例



如何在模型窗体的clean方法中获取文章实例?我尝试了访问self.instance但它None.如何获取以前的字段值?

class Article(models.Model):
name = models.CharField(max_length=25)
value = models.CharField(max_length=25)

形式

class ArticleForm(forms.ModelForm)
class Meta:
model = Article
fields = '__all__'
def clean(self):
cleaned_data = super().clean()
get_instance = self.instance
print(get_instance) and I get None

视图

def test(request)
form = ArticleForm({'name':'test', 'value':'test'})
if form.is_valid():
print(1)
else:
print(form.errors)

您之所以None,是因为您没有使用实例实例化表单。

form = ArticleForm({'name':'test', 'value':'test'})

如果使用实例实例化窗体,则可以在clean方法中使用self.instance访问它。

article = Article.objects.get(pk=1)
form = ArticleForm({'name':'test', 'value':'test'}, instance=article)

但是,请注意,清理窗体会更改模型实例。如果你想要原始值,你应该从数据库中重新获取实例,例如 original_instance = Art

def clean(self):
cleaned_data = super().clean()
if self.instance is not None and self.instance.pk is not None:
original_instance = Article.objects.get(pk=self.instance.pk)
else:
original_instance = None
...

如果您只想知道哪些字段发生了更改,而不关心它们的原始值,则使用changed_data属性会更简单。

最新更新