【问题标题】:Save form data in Django在 Django 中保存表单数据
【发布时间】:2015-12-02 02:35:53
【问题描述】:

我正在尝试在 Django 中设置一个表单并将数据保存到我的数据库中,而不使用 ModelForm。我的表单正在工作,但我坚持的部分是如何处理表单数据并将其保存在视图中。如您所见,在 'if form.is_valid():' 之后,我被卡住了,想不出正确的代码。

# models.py

from django.db import models

class Listing(models.Model):
    business_name = models.CharField(max_length=80)
    business_email = models.EmailField()
    business_website = models.CharField(max_length=80)
    business_phone = models.CharField(max_length=80)

# forms.py

from django import forms

class NewBusinessForm(forms.Form):
    business_name = forms.CharField(label='Business Name', max_length=100)
    business_phone = forms.CharField(label='Phone Number', max_length=100)
    business_email = forms.EmailField(label='Email Address', max_length=100)
    business_website = forms.CharField(label='Web Site', max_length=100)

# views.py

from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import NewBusinessForm

def new_business(request):
    if request.method == 'POST':
        form = NewBusinessForm(request.POST)
        if form.is_valid():
            # process form data
            return HttpResponseRedirect('/')

    else:
        form = NewBusinessForm()

    return render(request, 'directory/new.html', {'form': form})

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    在 Django 2.0 中,我认为有一个简单的方法,在基于类的视图中使用 FormView

    from django.views.generic.edit import FormView
    class newBusiness(FormView):
        form_class = NewBusinessForm
        success_url ="/"
        template_name = "temp.html"
        def form_valid(self, form):
            form.save()
            return redirect(self.success_url )
    

    我没有测试它运行,但我认为它会好的。更多https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/

    【讨论】:

      【解决方案2】:

      您需要手动创建对象并设置所有字段。这是一个例子。

      def new_business(request):
          if request.method == 'POST':
              form = NewBusinessForm(request.POST)
              if form.is_valid():
                  # process form data
                  obj = Listing() #gets new object
                  obj.business_name = form.cleaned_data['business_name']
                  obj.business_email = form.cleaned_data['business_email']
                  obj.business_phone = form.cleaned_data['business_phone']
                  obj.business_website = form.cleaned_data['business_website']
                  #finally save the object in db
                  obj.save()
                  return HttpResponseRedirect('/')
              ....
      

      请注意,如果字段值不遵循约束,则保存对象可能会失败。所以你需要注意这一点。

      【讨论】:

      • 别忘了导入Listing模型
      • 成功了,谢谢!大多数人会把这个逻辑放到views.py中吗?还是将其作为函数包含在 forms.py 中更好?
      • @Casey,大多数情况下这应该使用模型表单来完成。或者,如果您愿意,可以将此逻辑放入 form.save() 方法中。
      • @BogeyJammer 嗨,我是新手,如何导入列表模型?试过谷歌搜索,但找不到。 :) tqvm
      • Listing 是一个特定于这个应用程序的类。所需的语法可能不同,但 view.py 开头的“from .models import Listings”应该可以解决问题。
      猜你喜欢
      • 2017-06-01
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 2016-08-09
      • 2022-01-25
      相关资源
      最近更新 更多