2012-04-13 3 views
0

Ich versuche, in meine Datenbank zu gehen und zu sehen, ob eine bestimmte Einreichung bereits eingereicht wurde und ob sie erneut eingereicht werden kann. Zur Zeit habe ich dieses Stück Code jedes Feld des Formulars Testen (ändert sich offensichtlich pro Feld, aber ich dachte, dass ich nur ein Feld der Einfachheit halber zeigen würde)Django Datenbank Anfragen. Duplikate in der Datenbank finden und verhindern, dass sie gesendet werden

if request.method == 'POST': 
    Cashtexts.objects.filter(cashTexts=request.POST['cashTexts']).exists() == False: 

Dann, wenn es nicht existiert geht weiter und die sparen Einreichungen in die Datenbank. Wenn es wahr zurückgibt, geht es zu einer else-Anweisung, die dem Benutzer mitteilt, dass das, was er eingegeben hat, bereits eingegeben wurde. zuvor funktionierte diese Art von Sache, aber ich änderte einige Variablennamen und jetzt hörte es auf zu arbeiten. Ich habe den Code ein paar Mal durchgeblättert, also dachte ich, dass etwas mit dieser Art von Filter grundsätzlich nicht stimmt, aber es macht Sinn in meinem Kopf.

def submit_win(request): 
    if request.method == 'POST': 
     if Cashtexts.objects.filter(cashTexts=request.POST['cashTexts']).exists() or Cashtexts.objects.filter(superPoints=request.POST['superPoints']).exists() or Cashtexts.objects.filter(varolo= request.POST['varolo']).exists() or Cashtexts.objects.filter(swagbucks = request.POST['swagbucks']).exists() or Cashtexts.objects.filter(neobux = request.POST['neobux']).exists() or Cashtexts.objects.filter(topline=request.POST['topline']).exists() or Cashtexts.objects.filter(Paidviewpoint=request.POST['Paidviewpoint']).exists() or Cashtexts.objects.filter(cashcrate=request.POST['cashcrate']).exists() == False: 
      form = CashtextsForm(request.POST) 
      if form.is_valid(): 
       form.save() 
       ref_create = Cashtexts.objects.filter(cashTexts=request.POST['cashTexts']) 
       return render_to_response('submitted_page.html', {'ref_create': ref_create}) 
     else: #Error message reading wither you didnt insert codes or you enter the same code twice 
      error = 'That code has already been submitted' 
      ref_create = CashtextsForm() 
      return render_to_response('submit.html', {'ref_create': ref_create,'error':error}, context_instance=RequestContext(request)) 
    else: #displays the page when the user asks to go to the submit page 
     ref_create = CashtextsForm() 
     return render_to_response('submit.html', {'ref_create': ref_create}, context_instance=RequestContext(request)) 

Auch wandte ich mich Cashtexts.objects.filter (cashTexts = request.POST [ ‚cashTexts‘]) intoa variabel und reichte es meine Vorlage, um zu sehen, was es zurückkehrt und es zurückkehrt Objekte, die haben sollten sagte die Aussage wahr. aber es schien sie einfach zu ignorieren und sie trotzdem einzureichen.

Ich könnte alle vorherigen Objekte löschen, die mit dem übereinstimmen, was sie bei der Einreichung eingegeben haben, aber das macht es weniger sicher und könnte dazu führen, dass Benutzer immer und immer wieder denken, dass sie es mehr bekommen. Ich würde lieber aufhören, bevor es passiert.

Antwort

1

Sie können nur die Definition Ihrer cashTexts Feld einzigartig in der Modelle Definition festgelegt:

def Cashtexts(models.Model): 
    name = CharField(max_length=50, unique = True) 

einfach die „einzigartige“ Argument auf true gesetzt für jedes Feld, das Sie einzigartig sein wollen und Sie sind fertig . So wie Djangos Formular-API funktioniert, übernehmen die Formularfelder die gesamte Fehlerbehandlung.


Mit den Modellfeldern auf einzigartige, wo notwendig, um Sie dies viel einfacher haben können:

def view(request): 

    if request.method == 'POST': 
     form = CashtextsForm(request.POST) 

     """ the next line is going to check uniqueness for each 
      of the models fields where you have set unique = True 
      If the field is not unique, it s field will have an 
      attribute error, which you can then render to the template """ 
     if form.is_valid(): 
      form.save() 
    else: 
     form = CashtextsForm() 

    context = RequestContext(request) 

    # now i pass the form to the template as 'ref_create' 
    context.update({'ref_create':form}) 
    return render_to_response('submit.html',context) 

Dann einfach Sie diese Form in Ihrer Vorlage machen (entweder mit form.as_p() Form. as_table() oder mit einem benutzerdefinierten Code wie folgt):

{% for field in ref_create %} 
    {{ field.label_tag }} 
    {{ field }} 
    {{ field.errors }} 
{% endfor %} 

jedes Feld in der Modelldefinition zu einzigartig gesetzt, die die in der Datenbank nicht eindeutig sein würden mehr, wenn Ihre Form wird nun gespeichert h ave eine Fehlermeldung, die etwas wie "Ein Cashtext mit diesem Namen ist schon vorhanden" sagt. 1: passen Sie die Formen (i das nicht empfehlen, bis Sie sich besser Verständnis davon haben, wie Django funktioniert) 2:


Sie Fehlermeldungen Customizing kann auf zwei Arten erfolgen, anstatt {{ field.errors }} etwas schreiben wie folgt aus:

{% if field.errors %} 
    The Cashtext field {{field.name}} value should be unique. 
{% endif %} 
+0

aus irgendeinem Grund funktioniert das nicht. Ich ließ die DB fallen und sync'd mit einem neuen und jetzt habe ich neuen Fehler, den es sagt Die Ansicht users.views.submit_win gab kein HttpResponse-Objekt zurück. wenn ein anderes für GET's das ungebundene Formular anzeigt. nicht sicher, warum das ist – city

+0

Nun, ich kann nichts dazu sagen, ohne Ihre Ansicht Code. – marue

+0

okay, ich habe die Ansicht für diese Seite hinzugefügt – city

Verwandte Themen