2017-05-15 3 views
-1

Ich habe das einzigartige zusammen Modell Meta verwendet, es funktioniert, aber es kommt nur mit diesem Fehler. Ich möchte einen Formularüberprüfungsfehler statt eines IntegrityError auslösen.Wie Formular Validierungsfehler ausgelöst werden, wenn der Benutzer versucht, ein Objekt mit dem Objekt zweimal zu erstellen

IntegrityError bei/name/

UNIQUE fehlgeschlagen: canvas_canvas.user_id, canvas_canvas.canvas_name

anfordern Methode: POST Anforderungs-URL: http://127.0.0.1:8000/name/ Ausnahmetyp: IntegrityError Ausnahmewert:

UNIQUE-Einschränkung fehlgeschlagen: canvas_canvas.user_id, canvas_canvas.canvas_name

Ausnahme Ort: C: \ Benutzer \ AppData \ Local \ Programme \ Python \ Python35-32 \ lib \ site-packages \ django \ db \ Backends \ sqlite3 \ base.py in ausführen, Linie 337

class Canvas(models.Model): 
    user    = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) 
    canvas_name   = models.CharField(
         max_length=100, 
         validators=[ 
          # validate_canvas_title, 
          RegexValidator(
            regex=CANVAS_REGEX, 
            message='Canvas must only contain Alpahnumeric characters', 
            code='invalid_canvas_title' 
           )], 
         ) 
    slug    = models.SlugField(max_length=100, blank=True) 
    background_image = models.ImageField(
         upload_to=upload_location, 
         null=True, 
         blank=True, 
         ) 
# sort catergory into alphabetical order 
    category   = models.ForeignKey('category.Category', default=1, blank=True) 
    followers   = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='canvas_followed_by', blank=True) 

class Meta: 
    unique_together = ['user', 'canvas_name'] 

Form

class CanvasModelForm(ModelForm): 
    class Meta: 
     model = Canvas 
     fields = ['canvas_name', 'category', 'background_image'] 
     widgets = { 
      'canvas_name': TextInput(attrs={'class': 'form-input'}), 
      'category': Select(attrs={'class': 'form-input'}), 
     } 

Ansicht

user = get_object_or_404(User, username=username) 

    form_create = CanvasModelCreateForm(request.POST or None) 
    if form_create.is_valid(): 
     instance = form_create.save(commit=False) 
     instance.user = request.user 
     instance.save() 
     return redirect('canvases:canvas', username=request.user.username, slug=instance.slug) 

    template = 'pages/profile.html' 
    context = { 
     'user': user, 
     'form_create': form_create, 
    } 
    return render(request, template, context) 
+0

Nr Ihre Form macht die Validierung. Aber Sie haben keinen Code angezeigt, so dass wir nicht sehen können, was falsch ist. –

+0

ich habe gerade die Frage aktualisiert. Ich denke, die Klasse Meta (unique_together = ['Benutzer', 'Canvas-Name']). ist die Ursache des Fehlers. – lolz

+0

Und was ist der * tatsächliche * Fehler und Traceback? Und wo ist die Aussicht? –

Antwort

0

Sie dies und es für die Validierung des canvas_name verwenden, indem request.user in Form tun könnte.

Sie müssen die Methode __init__ des Formulars außer Kraft setzen, um ein zusätzliches Schlüsselwortargument zu verwenden, user. Dadurch wird der Benutzer in dem Formular gespeichert, in dem es benötigt wird, und von wo aus Sie in Ihrer Bereinigungsmethode darauf zugreifen können.

def __init__(self, *args, **kwargs): 
    self.user = kwargs.pop('user', None) 
    super(CanvasModelCreateForm, self).__init__(*args, **kwargs) 

def clean_canvas_name(self): 
    canvas_name = self.cleaned_data.get('canvas_name') 
    if Canvas.objects.get(user=self.user, canvas_name=canvas_name).exists(): 
     raise forms.ValidationError(u'Canvas with same name already exists.') 
    return canvas_name 

Und Sie sollten so wie dies in der Ansicht ändern,

form_create = CanvasModelCreateForm(request.POST, user=request.user) 
Verwandte Themen