Django spielt keine call-Modell saubere Methode
Ich habe ein view erstellt Modelle aus CSV-Datei. Ich habe clean-Methode der model-Klasse definition, aber es wird nicht aufgerufen, wenn das Modell erstellt wird.
Hier ist Beispiel von models.py:
class Run(models.Model):
name = models.CharField(max_length=120)
tested_build = models.ForeignKey('apps.Build')
timestamp_start = models.DateTimeField()
timestamp_end = models.DateTimeField()
class CommonMeasurement(models.Model):
timestamp = models.DateTimeField()
value = models.FloatField()
run = models.ForeignKey(Run)
def clean(self):
super(CommonMeasurement, self).clean()
print 'here we go'
if self.timestamp < self.run.timestamp_start or self.timestamp > self.run.timestamp_end:
raise django_excetions.ValidationError('Measurement is outside the run')
class ClientMeasurement(CommonMeasurement):
metric = models.ForeignKey(ClientMetric)
account = models.CharField(max_length=120, blank=True)
Hier ist mein Formular Anzeigen-code Beispiele:
class BaseMeasurementsUpload(generic_views.FormView):
template_name = 'upload.html'
models_to_upload = None
def get_success_url(self):
return self.request.get_full_path()
def form_valid(self, form):
uploader = getattr(importers, form.cleaned_data['uploader'])
try:
the_uploader = uploader(form.cleaned_data, self.models_to_upload)
upload_results = the_uploader.get_result_info()
except django_exceptions.ValidationError as e:
custom_errors = e
return render_to_response(self.template_name,
{'upload_results': upload_results,
'custom_errors': custom_errors},
context_instance=RequestContext(self.request))
class ClientMeasurementsUploadView(BaseMeasurementsUpload):
form_class = forms.ClientMeasurementsUploadForm
models_to_upload = models.ClientMeasurement
def get_form(self, form_class):
uploaders = (('MeasurementsSimpleCsv', importers.MeasurementsSimpleCsv.__doc__),
('ClientMeasurementsBulkCsv', importers.ClientMeasurementsBulkCsv.__doc__,))
if self.request.POST:
# get bound form
return self.form_class(uploaders,
self.request.POST,
self.request.FILES)
else:
return forms.ClientMeasurementsUploadForm(uploaders)
Importeure führen tatsächliche Validierung und call-create-Methode für jedes Modell.
Können Sie nach Ihrem anzeigen-code? Vielleicht sind Sie nicht aufrufen is_valid auf Ihre ModelForm?
clean
ist für ModelForm
oder Form
Objekte. Nicht für Modelle. dies würde nie genannt, bekommen automatisch.InformationsquelleAutor Nikolai Golub | 2013-09-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nennen das Modell sauber-Methode, die wir überschreiben die Methode speichern. Überprüfen Sie den link: https://docs.djangoproject.com/en/2.0/ref/models/instances/#django.db.models.Model.clean
djangorestframework
der clean-Methode nicht aufrufen, die mit dieser Methode mein problem gelöst.InformationsquelleAutor seenu s
Habe ich eine Lösung gefunden zu überschreiben-Methode:
Aber ich bin mir nicht sicher, dass es eine gute Entscheidung.
Tatsächlich, Fehler bei der überprüfung ist erfolgreich in der oberen anzeigen-Ebene.
Dies funktioniert aber Django nicht wie ValidationError während dem speichern() und wieder ein (schrecklich) 500 Server-Fehler anstatt 400 Bad Request. Ich bin noch auf der Suche für eine Lösung auf dieser.
InformationsquelleAutor Nikolai Golub
Offenbar Modell.clean() nie aufgerufen wird aus Gründen der Abwärtskompatibilität. Weitere Informationen auf: https://code.djangoproject.com/ticket/13100
1. Meine Lösung ist, verschieben Sie alle der code, den ich hätte setzen in saubere() speichern(). Ich denke, deine Lösung ist sauberer. 2. Ich habe keine Idee, was es soll, zu brechen.
InformationsquelleAutor Thomas Maurin
Scheinbar in neueren Versionen von Django die
ModelForm.full_clean
nennt es " - Instanzfull_clean
Methode:save
aufrufen nichtfull_clean
.InformationsquelleAutor Ariel