【问题标题】:Why django form input is not being saved in database?为什么 django 表单输入没有保存在数据库中?
【发布时间】:2019-05-06 20:46:30
【问题描述】:

我创建了一个表单,它将接受输入并将输入值保存在数据库(mysql)中。我的forms.py

class postcreation(forms.Form):
    post_title = forms.CharField(max_length=200, widget=forms.TextInput(attrs={'name':'post_title'}))
    post_name = forms.CharField(max_length=200, widget=forms.TextInput(attrs={'name':'post_name'}))
    post_post = forms.CharField(widget=forms.Textarea(attrs={'name':'post_post'}))

我的模型.py

class postdata(models.Model):

    title = models.CharField(max_length=200)
    name = models.ForeignKey(userdata, on_delete='CASECADE')
    post = models.TextField()

    def __str__(self):
        return self.title

起初我没有使用“attr”值。它没有用。我看到了一个stackoverflow的答案,说我应该。还是没有运气。

我的意见.py

def postinput(request):

    if request.method == 'POST':
        form = postcreation(request.POST)
        if form.is_valid():
            inputpost = postdata(title=request.POST['post_title'], name=request.POST['post_name'], post=request.POST['post_post'])
            inputpost.save()
            return redirect('index')
    else:
        form = postcreation()

    context = { 'form': form }
    return render(request, 'firstapp/postinput.html', context)

html模板

<form method="POST" action="{% url 'index' %}">
    {% csrf_token %}
    {{ form }}
    <button type="submit">Post</button>
</form>

我试图通过表单获取输入并将其保存到数据库。但我无法这样做。我不明白为什么。我正在阅读一些教程和一些 stackoverflow 问题。它仍然不起作用。感谢您的帮助。

【问题讨论】:

  • 尝试在context = 之前添加print(from.errors)或添加到模板{{form.errors}}
  • 始终在调试器中检查request.POST(或通过打印它)以了解发生了什么。是的,@NS0 是正确的,下面的答案是您不应该直接保存 POST 数据,而是使用 form.cleaned_data 字典来访问这些值。使用 POST 数据会引发黑客攻击。
  • 如果form.is_valid() 返回 false,您的视图不会保存。正如@BearBrown 评论的那样,html 模板应该显示表单错误,所以你知道什么时候出了问题。
  • 所以您在 HTML 表单中看到了任何错误?还是在您的控制台中?
  • 在这个例子中,看起来您正在构建一个表单来创建模型的实例。这没有什么问题,尤其是作为学习练习,但在真正的 Django 项目中,通常的做法是使用内置的 modelform 类:docs.djangoproject.com/en/2.2/topics/forms/modelforms

标签: python django django-models django-forms django-views


【解决方案1】:

您可以从经过验证的表单而不是直接从请求中获取值,如下所示:

    # . . .
    if form.is_valid()
        inputpost = postdata(title=form.cleaned_data.get('title'), 
                             name=form.cleaned_data.get('name'), 
                             post=form.cleaned_data.get('post'))
    # . . .

由于postdata.name 是一个用户数据对象,您需要将其指向一个。例如,做这样的事情

    if form.is_valid()
        inputpost = postdata(title=form.cleaned_data.get('title'),
                             post=form.cleaned_data.get('post'))

        name=form.cleaned_data.get('name')
        inputpost.name = userdata.objects.get(name=name) # or something similar, 
                                                         # depending on what exactly 
                                                         #`userdata` is and how 
                                                         # to get the relevant instance.
        inputpost.save()

我不确定如何获取userdata 帖子,因为这取决于您的其余代码,但大致就是这样。

您也可能希望创建一个新的userdata 对象。就像这样:

        # . . . 
        name=form.cleaned_data.get('name')
        ud = userdata(name=name)
        ud.save()
        inputpost.name = ud, 
        inputpost.save()
        # . . . 

同样,取决于userdata 是什么。

【讨论】:

  • 为什么您认为该表格有效?
  • 我假设他只想在表单有效的情况下保存对象
  • 我也是,但为什么你认为麻烦只在于获取数据的方式?
  • 我试过了,但它显示错误。 Cannot assign "'alom'": "postdata.name" must be a "userdata" instance. 但是“alom”是一个用户数据值。
  • 更新答案。
猜你喜欢
  • 2020-09-04
  • 2018-06-08
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2015-09-21
  • 2020-02-21
  • 2020-05-26
  • 2021-05-03
相关资源
最近更新 更多