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

时间:2018-05-15 10:23:54

标签: python django django-forms

如何在我的模型表单的clean方法中获取Article实例?我尝试过访问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)

1 个答案:

答案 0 :(得分:1)

您得到None,因为您没有使用实例实例化表单。

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

如果您使用实例实例化表单,则可以使用self.instance方法中的clean访问该表单。

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属性会更简单。