【问题标题】:Save data to database using Django forms使用 Django 表单将数据保存到数据库
【发布时间】:2016-12-05 07:55:59
【问题描述】:

我的保存按钮没有将用户输入的数据以django形式保存到数据库中,问题出在哪里?

models.py

class Cemetery(models.Model):
    id = models.AutoField(primary_key=True)
    name=models.CharField(verbose_name="Cemetery Name",max_length=100)
    city=models.CharField(max_length=30)
    zipcode=models.CharField(max_length=5)
    date_created=models.DateTimeField(editable=False, auto_now_add=True)
    date_modified= models.DateTimeField(editable=False, auto_now=True)
    created_by=models.ForeignKey('auth.User')

    def __str__(self):
        return  str(self.id) +'-' + self.name + ' -  ' + self.city

forms.py

class CemeteryForm(forms.ModelForm):
     class Meta:
        model=Cemetery
        fields=('name','city','zipcode',)

views.py

def cemetery_add(request):
    if request.method=="POST":
        form=CemeteryForm(request.POST)
        if form.is_valid():
            cemetery=form.save(commit=False)
            cemetery.name=request.name
            cemetery.city=request.city
            cemetery.zipcode=request.zipcode
            cemetery.created_by=request.user
            cemetery.date_created=timezone.now()
            cemetery.save()
            return redirect('cemetery_list')
    else:
        form=CemeteryForm
    return render(request,'heaven/edit_cemetery.html',{'form':form})

模板

{% extends 'heaven/base.html' %}

{% block content %}
    <!-- Edit Cemetery -->
    <h2>New Cemetery</h2>
    <form method="POST" class="cemetery-form">{% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="save btn btn-default">Save</button>
    </form>
{% endblock %}

当我按下保存按钮时,这是我收到的错误: /cemetery_add/ 处的 AttributeError 'WSGIRequest' 对象没有属性 'name'

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    在您的表单中,您直接在请求中查找值

    request.name
    

    您需要查看表单的清理数据

    form.cleaned_data.get('name')
    

    虽然,这实际上不是必需的,因为该值已经从绑定表单中设置。

    如果你真的想使用 post 数据,那么它会在 POST 字典中找到

    request.POST.get('name')
    

    简而言之,忽略重置这些值,只需添加您需要的字段

    cemetery=form.save(commit=False)
    cemetery.created_by=request.user
    cemetery.date_created=timezone.now()
    cemetery.save()
    

    【讨论】:

    • 非常感谢您的回答!我现在有点困惑,我尝试了不同的场景,但都没有奏效。你的意思是忽略你提到的那 4 行还是保留它们并删除其余的?你会如何重写views.py?
    【解决方案2】:

    这个成功了,我遇到了身份验证问题,因为我的登录会话已过期,我无法保存:

    def cemetery_add(request):
    if request.method=='POST':
        form=CemeteryForm(request.POST)
        if form.is_valid():
            cemetery=form.save(commit=False)
            cemetery.name=request.POST.get('name')
            cemetery.city=request.POST.get('city')
            cemetery.zipcode=request.POST.get('zipcode')
            cemetery.date_created=timezone.now()
            if request.user.is_authenticated:
                cemetery.created_by=request.user
            else:
                return login(request)
            cemetery.save()
            return redirect('cemetery_list')
    else:
        form=CemeteryForm
    return render(request,'heaven/edit_cemetery.html',{'form':form})
    

    【讨论】:

      猜你喜欢
      • 2017-03-06
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      相关资源
      最近更新 更多