问题
I'm trying to set up a form in Django and save the data to my database, without using a ModelForm. My form is working, but the part I am stuck on is how to process the form data and save it within the view. As you can see, after 'if form.is_valid():' I am stuck and cannot think of the right code.
# 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})
回答1:
You need to create the object and set all fields manually. Here is an example.
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('/')
        ....
Note that saving object may fail if field values do not follow the constraint. So you need to take care of that.
回答2:
In Django 2.0, I think there is an easy way, use FormView in class based view.
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 )
I did not test it to run, but i think it will be OK. More at https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/
来源:https://stackoverflow.com/questions/32423401/save-form-data-in-django