2012-04-13 6 views
0

Ich habe jeden "InterityError" + "kann nicht NULL" Beitrag gelesen und kann immer noch nicht aufspüren, was diesen Fehler verursacht.Django IntegrityError signup_simplesubscriber.date_created ist möglicherweise nicht NULL

Ich habe ein zweiteiliges Anmeldeformular. Der erste Teil ist nur ein Produkt auszuwählen. Das übergibt eine Produkt-ID als Teil der URL an die nächste Seite, wo sie persönliche Informationen eingeben. Ich kann das Formular in Ordnung bringen, bis ich anfange, Felder zu entfernen - ich benutze Modellformulare -, weil einige Felder nicht angezeigt werden müssen.

Hier ist mein Modell, und die Modelform:

class SimpleSubscriber(models.Model): 
    name = models.CharField(max_length=255) 
    address = models.CharField(max_length=200) 
    city = models.CharField(max_length=100) 
    state = models.CharField(max_length=2) 
    zipcode = models.CharField(max_length=9) 
    phone = models.CharField(max_length=10) 
    email = models.EmailField() 
    date_created = models.DateTimeField(null=True) 
    sub_type = models.ForeignKey(Product) 
    def __unicode__(self): 
     return self.name 


class SubscriberForm(ModelForm): 
    class Meta: 
     model = SimpleSubscriber 
     fields = ('name', 'address', 'city', 'state', 'zipcode', 'phone', 'email', 'sub_type',)#'date_created', 

Und hier ist meine Ansichten:

def select_product(request): 
    title = "get yourself an e-edition. wurd." 
    pform = Product.objects.order_by('product_active') 
    if request.method == 'POST': # If the form has been submitted... 
     pform = ProductForm(request.POST) # A form bound to the POST data 
     if pform.is_valid(): # All validation rules pass 
     # ... 
      return HttpResponseRedirect('signup/%i' % pform.id) # Redirect after POST 
    else: 
     form = ProductForm() # An unbound form 
    return render_to_response('signup/index.html', {'title': title, 'pform': pform}, context_instance=RequestContext(request)) 


def subscriber_signup(request, product_id): 
    productchoice = Product.objects.get(id=product_id) 
    now = datetime.datetime.now() 
    title = "We need some information." 
    if request.method == 'POST': # If the form has been submitted... 
     sform = SubscriberForm(request.POST) # A form bound to the POST data 
     if sform.is_valid(): # All validation rules pass 
      sform.date_created = now 
      sform.sub_type = productchoice 
      sform.save() 
      return HttpResponseRedirect('thankyou/') # Redirect after POST 
    else: 
     sform = SubscriberForm() # An unbound form 
    return render_to_response('signup/detail.html', {'title': title, 'sform': sform, 'productchoice': productchoice, 'now': now.date(),}, context_instance=RequestContext(request)) 

Ich denke, es ist etwas mit dem Modelform zu tun hat, aber ich bin ziemlich neu, so Ich habe wirklich keine Ahnung. Wenn ich alle Felder SubscriberForm hinzufüge, werden sie ausgefüllt und alles funktioniert gut. Aber ich möchte nicht, dass Benutzer sagen müssen, wann sie das Formular ausgefüllt haben, also setze ich sform.date_created = jetzt und ich möchte, dass die product_id automatisch von der Auswahl ausgefüllt wird, die sie auf der vorherigen Seite ausgewählt haben. Aber wenn ich diese Felder aus dem Formular ausschließe, wird der IntegrityError ausgelöst, was nicht sehr hilfreich ist, um zu erklären, was geändert werden soll.

Irgendwelche Hinweise auf wo ich vermasseln?

Danke,

Antwort

1

Zwei Dinge:

1) Sie profitieren können in Ihrer Formulardefinition exlude mit:

class SubscriberForm(ModelForm): 
    class Meta: 
     model = SimpleSubscriber 
     exclude = ('date_created',) 

2) Um Ihre Frage, here, wie es zu beheben:

if sform.is_valid(): # All validation rules pass 

    suscriber = sform.save(commit=False) 
    suscriber.date_created = now 
    suscriber.sub_type = productchoice 
    suscriber.save() 
+0

Das ist genial. Definitiv den Fehler behoben. Warum commit = False? Was macht das und ist die Reihenfolge dieser Befehle wichtig? Ich nehme an, die sform.save (commit = False) muss zuerst gehen und subscriber.save() zuletzt? –

+0

Der Job der Speichermethode des Formulars besteht darin, die Daten zu verarbeiten und ein Objekt zurückzugeben. Wenn Sie sagen, dass es nicht festgeschrieben werden soll, bedeutet dies, dass es das tut, aber ohne den Datenbank-Synchronisierungsteil. – fceruti

0

Alternativ zu @ fceruti Vorschlag, können Sie auch mehr kwarg tags hinzufügen null=True gegebenenfalls auf das Feld des Modells - nur erzwingen, dass ein minimaler Satz von Feldern im Formular ausgefüllt wird.

Verwandte Themen