2016-03-19 17 views
0

Ich baue eine Webanwendung auf Django. Als Teil davon, ich habe ein HTML-Formular erstellt wie folgt vor:Rendering Django Modell Validierungsfehler in Vorlage

<form method="post" action="/voting/add_state/">{% csrf_token %} 
    State name:<br> 
    <input type="text" name="state_name"><br> 
    <input type="submit" value="Submit"> 
</form> 

In models.py Ich habe hinzugefügt eindeutige Einschränkung Validierung auf Namen wie folgt vor:

class State(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    vote_counted = models.BooleanField(default=False) 

So nach doppelten Namen, es wirft Ein eindeutiger Constraint-Fehler, den ich in der Vorlage erfassen möchte. Kann mir bitte irgendeinen Vorschlag geben.

+0

Wie speichern Sie die POST-Daten? Können Sie den entsprechenden Code veröffentlichen? – Selcuk

+0

@Selcuk, ich könnte mir vorstellen, dass er nichts von Djangos Standard-Speichermethode geändert hat. –

+0

@ChuckLoganLim Es sieht nicht so aus der Vorlage. – Selcuk

Antwort

0

Django hat Form Verarbeitung eingebaut. Django hat "Model Forms", die automatisch das Formular für Ihr Modell rendern. Wenn Sie die Ansicht übergeben und im Kontext darauf verweisen, wird automatisch der HTML-Code für Sie generiert. Wenn Sie jedoch mehr Kontrolle darüber haben möchten, was in der Vorlage gerendert wird, können Sie auf die Formularattribute von Django Model Form verweisen.

Ich empfehle dringend, innerhalb des Rahmens zu arbeiten, den Django Ihnen für den Aufbau von Formularen bietet; Es bietet eine Vielzahl von Standardcodes zum Erstellen, Validieren und Abstrahieren von Formularen und ist besonders für einfache Formen wie diese geeignet. Hier

ist ein Beispiel:

models.py

class State(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    vote_counted = models.BooleanField(default=False) 

forms.py

class StateForm(forms.ModelForm): 
    model = State 
    fields = (name,) 

views.py

from django.views.generic.edit import FormView 

class StateForm(FormView): 
    template_name = 'state_form.html' 
    form_class = StateForm 
    success_url = '/thanks/' 

sta te_form.html (Beispiel Auto erzeugten Form)

{{ form }} 

state_form.html (Beispiel für individuelle Form)

<form action="/" method="post"> 
    {% csrf_token %} 
    {{ form.errors }} 
    {% for field in form %} 
     <input type="{{ field.type }}" name='{{ field.name }}' class="submit" value="{{ field.value}}"> 
    {% endfor %} 
    <input type="submit" name='submit" value="Submit"> 
</form> 

Referenzen:

Django Forms: https://docs.djangoproject.com/en/1.9/topics/forms/

Django Modell Formulare: https://docs.djangoproject.com/en/1.9/topics/forms/modelforms/

Django Generic Views: https://docs.djangoproject.com/en/1.9/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView

0

ein Formular auf Ihrem Modell dieses Formular auf Ihren Ansichten

basierend erstellen
#forms.py 
from django import forms 
from .models import State 

class StateForm(forms.ModelForm): 

    class Meta: 
     model = State 
     fields = ('name',) 

jetzt

#views.py 
from django.views.generic import FormView 
from .forms import StateForm 

class MyView(FormView): 

    template_name = 'template.html' 
    form_class = StateForm 
    success_url = '/my-url-to-redirect-after-submit/' 

Vorlage verwenden.html

<form method="post"> 
    {% csrf_token %} 
    Name 
    {{ form.name }} 
    {{ form.name.errors }} 
    <input type="submit" value="Create"> 
</form> 
0

Sie könnten ein Formular für State Modell erstellen und die Prüfers erstellen, so dass, wenn der Benutzer mit einem doppelten Namen versuchen, die Form eine Nachricht etwas wie folgt erhöhen:

models.py 
class State(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    vote_counted = models.BooleanField(default=False) 

forms.py 
def unique_name(value): 
    exist = State.objects.filter(name=value) 
    if exist: 
     raise ValidationError(u"A state with the name %s already exist" % value) 

class StateForm(forms.Form): 
    name = forms.CharField(label=('Name:'), validators=[unique_name]) 

Sie dann einfach müssen die StateForm in der Vorlage rendern.