2016-07-05 18 views
0

IDjango in dem Formular fängt unique_together und nicht speichert Datei

class Document(models.Model): 
    profile = models.ForeignKey(Profile, null=True) 

    hash = models.CharField(max_length=100, blank=True) 
    name = models.CharField(max_length=100, blank=True) 
    url = models.CharField(max_length=100, blank=True) 

    file = models.FileField() 

    def __str__(self): 
     return str(self.id) 

    @property 
    def gen_url(self): 
     self.url = uuid.uuid4().hex 

    @staticmethod 
    def gen_digest(file): 
     m = hashlib.md5() 
     for chunk in read_by_chunk(file): 
      m.update(chunk) 
     digest = m.hexdigest() 
     return digest 

    class Meta: 
     unique_together = (('profile', 'hash'),) 

habe Wenn ich versuche Dokument mit den gleichen profile und document über Admin zu erstellen, gibt es einen Fehler durch Form. Es ist ein richtiger Weg, den ich aus meiner Sicht erreichen möchte.

Aber:

if form.is_valid(): 

    print 'valid' 
    try: 
     form.save() 
    except IntegrityError: 
     print 'unique error' 
     messages.add_message(request, messages.ERROR, u'already have') 
    return HttpResponseRedirect('/') 
else: 
    return HttpResponse('not valid') 

nicht in Fehler.

So Fragen:

1) Wie kann ich messages zeigen vielmehr, dass andernfalls IntegrityError

2) Wie kann ich file verhindern im Speicher erstellt werden

Antwort

0

Die Modelform standardmäßig Einzigartigkeit bestätigen sollte, es sei denn, Das Feld ist ausgeschlossen. Vom django 1.9 source code

# self._validate_unique will be set to True by BaseModelForm.clean(). 
    # It is False by default so overriding self.clean() and failing to call 
    # super will stop validate_unique from being called. 

was wiederum die validate_unique Methode Modell-Instanz aufruft. Allerdings passen sie vom exclude Gotcha - gemäß dem docs

Model.validate_unique(exclude=None)

Diese Methode ist ähnlich wie clean_fields(), aber validiert alle Einzigartigkeit Einschränkungen für Ihr Modell anstelle von einzelnen Feldwerte. Mit dem optionalen Argument exclude können Sie eine Liste von Feldnamen angeben, die von der Validierung ausgeschlossen werden sollen. Es wird einen ValidationError auslösen, wenn Felder die Validierung nicht bestehen.

Beachten Sie, dass bei der Angabe eines Ausschlussarguments für validate_unique() keine unique_together-Einschränkung für eines der von Ihnen angegebenen Felder aktiviert wird.

Wenn alles fehlschlägt, können Sie in Ihrem Formular clean Methode aufrufen explizit self.instance.validate_unique()