从模型形式 Django 保存数据

Posted

技术标签:

【中文标题】从模型形式 Django 保存数据【英文标题】:Saving data from a modelform Django 【发布时间】:2016-08-16 20:01:58 【问题描述】:

现在抬头!我是 NOOBSVILLE 的 NOOB-BUS 上的新手!

所以我正在处理一个表单来加载信息并编辑该表单信息,我很头疼。所以我正在使用:

姜戈:1.8 皮顿:3.5.1 后端是 sqlite

我正在使用 form.ModelForm 将信息加载到其中,但是在保存时,这就是我卡住的地方。我应该使用全部还是只使用一个干净的文档,文档非常混乱。

这是forms.py

    class EditContact(forms.ModelForm):
    class Meta:

    model = Contact
    #the list of all fields

    exclude = ['date_modified']


    def clean(self):
        if self.date_of_entry is None:
            print("looking to see what works")
            self.date_of_entry = datetime.date.today()
            return


    def clean_ContactID(self):
        #see this line below this comment i dunno what it does 
        ContactID= self.cleaned_data.get('ContactID')
        print ("cleaning it")
        # i also dont know what validation code suppose to look like
        # i cant find any working examples of how to clean data
        return ContactID

现在主要有更多的 def clean_methods 但我认为我想要使用的是干净的,除了我认为应该使用所有其他方法。

这是在 view.py 中

def saveContactInfo (request):

    #this part i get 
    if  request.user.is_authenticated():

        ContactID= request.POST['ContactID']

        a = ListofContacts.objects.get(ContactID=ContactID)


        f = EditContact(request.POST,instance=a)       

        print("plz work!")
        if f.is_valid():
            f.save() 
            return render (request,"Contactmanager/editContact.html",   'contactID': contactID)
        else:
            return HttpResponse("something isnt savin")

    else:
        return HttpResponse("Hello, you shouldnt ")

这是model.py

 def clean(self):

    if self.ConactID is None:
        raise  ValidationError(_('ContactID  cant be NULL!'))

    if self.date_of_entry is None:
        print("think it might call here first?")
        self.date_of_entry = datetime.date.today()
        print ( self.date_of_entry  )

    if self.modified_by is not None:
        self.modified_by="darnellefornow"
        print(self.modified_by )

    if self.entered_by  is not None:
        self.entered_by = "darnellefornow"
        print(self.entered_by )
        ContactID = self.cleaned_data.get('ContactID')

    return

现在模型上面的字段和类型都有空白 = true 和 null = true 除了排除字段 date_of_entry

我发现当在视图中调用 is_valid() 时,它会调用 models.clean() 但无法保存!!!我不知道为什么!我不知道如何进行验证。我想知道流程和需要什么,甚至是表单验证字段的示例。

【问题讨论】:

我真的不明白你在这里问什么。如果您对 ContactID 字段没有任何自定义验证,为什么要定义 clean_ContactID()?你想达到什么目的? 老实说,我不知道我正在学习教程并在我的个人项目中尝试它。所以你说的只是使用 clean()?好的,我会的,但它仍然失败,我不知道为什么 好吧,伙计们,我找到了解决我头痛的方法,我的一个字段是日期时间,我输入的日期格式错误。所以它期待“08/16/2016”而我输入“2016/16/08”导致它失败。 (验证)所以对于未来的人!观察您将数据输入表单的方式。尤其是日期! 【参考方案1】:

我认为您在查看您的代码 cmets 时需要有关这里的几件事的信息/答案。希望这会有所帮助:

1) 如果您需要专门为该字段处理自定义内容,则只需使用 clean_FIELDNAME 函数。 Django docs show this as an example:

def clean_recipients(self):
    data = self.cleaned_data['recipients']
    if "fred@example.com" not in data:
        raise forms.ValidationError("You have forgotten about Fred!")

    # Always return the cleaned data, whether you have changed it or
    # not.
    return data

因此,在该块中,他们正在检查提供的电子邮件列表是否包含特定电子邮件。

2) 这也显示了您在 cmets 中询问的有关如何处理验证的另一个问题。您将在上面的 sn-p 中看到,您可以引发 forms.ValidationError。此处对此进行了更多讨论:https://docs.djangoproject.com/en/1.10/ref/forms/validation/

因此,如果任何这些 clean_ 方法或主 clean 方法中出现错误,则 form.is_valid() 将为 false。

这有帮助吗?

【讨论】:

好的,所以我应该使用 clean() 来清理所有内容!还有一个附带问题,它在我进行迁移后添加了 clean 方法并且它未能更新迁移会导致清理中的任何错误吗?我也在使用modelform,所以clean()也可以使用它吗?无论如何,我也可以让系统打印出为什么它无法编辑我的联系人?并且帮助验证会很好,就像 self.cleaned_data.get['contactID'] 我要求很多我知道我只是困惑 当然,因此迁移只会影响数据库并根据您的模型更改对其进行更新。我认为它不会对表单清理结果产生任何直接影响,除非您的模型更改由于字段不可为空或为空而导致验证失败。要查看验证失败的原因,请尝试调试并单步执行检查 f.is_valid() 的“if 条件”,或使用 print(f.errors) 打印到控制台,或在模板中显示字段错误你的用户(你最终可能会这样做)。 查看 Django 文档:docs.djangoproject.com/en/1.10/ref/forms/api/… 和 docs.djangoproject.com/en/1.10/topics/forms/… 了解有关这些主题的更多信息 非常感谢!你帮助我更好地理解了 clean() 和验证,我通过删除所有 clean() 解决了它,并注意到我输入的日期时间字段错误,现在正在工作我可以轻松编辑数据 太棒了!很高兴我能帮上忙。如果我的回答足够好,欢迎采纳。

以上是关于从模型形式 Django 保存数据的主要内容,如果未能解决你的问题,请参考以下文章

Django:使用 JSON 数据创建和保存模型

如何以 django 模型形式覆盖保存方法

在Django中将计算值从视图保存到模型

在数据库中保存 Django 的表单向导 form_list 的最简单方法?

如何在将密码保存到用户模型 Django 之前对其进行加密?

Django 模型没有保存到 Celery Task 中的数据库中