Ich bezweifle stark, dass die Art und Weise, wie ich das zusammensetze, Best Practice oder sogar sicher ist.
Es ist eine FBV, die Benutzern ermöglicht, ihre Profile mithilfe der bereitgestellten ModelForm zu aktualisieren.Was ist ein effizienterer Weg, ein Django-Objekt zu validieren/speichern(), während man die Wiederholung abstrahiert?
Aussicht:
def profile_edit(request):
if request.method == 'POST':
form = ProfileForm(request.POST)
if form.is_valid():
instance = Profile.objects.get(user=request.user)
instance.activity1 = form.cleaned_data.get("activity1")
instance.activity2 = form.cleaned_data.get("activity2")
instance.activity3 = form.cleaned_data.get("activity3")
instance.subject1 = form.cleaned_data.get("subject1")
instance.subject2 = form.cleaned_data.get("subject2")
instance.subject3 = form.cleaned_data.get("subject3")
instance.introduction = form.cleaned_data.get("introduction")
instance = form.save(commit=False)
instance.save()
return redirect('/profile/edit')
else:
form = ProfileForm(instance=request.user, initial={
'activity1': Profile.objects.get(user=request.user).activity1,
'activity2': Profile.objects.get(user=request.user).activity2,
'activity3': Profile.objects.get(user=request.user).activity3,
'subject1': Profile.objects.get(user=request.user).subject1,
'subject2': Profile.objects.get(user=request.user).subject2,
'subject3': Profile.objects.get(user=request.user).subject3,
'introduction': Profile.objects.get(user=request.user).introduction,
})
context = {
'user': request.user,
'form': form,
}
return render(request, 'profile_edit.html', context)
Die Form:
class ProfileForm(forms.ModelForm):
activity1 = forms.CharField(max_length=54, label='Activity 1')
activity2 = forms.CharField(max_length=54)
activity3 = forms.CharField(max_length=54)
subject1 = forms.CharField(max_length=54)
subject2 = forms.CharField(max_length=54)
subject3 = forms.CharField(max_length=54)
introduction = forms.CharField(widget=forms.Textarea)
def clean(self):
cleaned_data = super(ProfileForm, self).clean()
return cleaned_data
Gibt es einen besseren Weg, dies erreicht zu erhalten? Ich würde denken, dass es eine Möglichkeit gibt, die gesamten cleaned
Formulardaten auf einmal zu erhalten und dann die mit den neuen POSTed Daten in weniger Anweisungen zu aktualisieren.
Und was ist mit Vorbestellung eines Formulars mit Daten bereits in der Datenbank gespeichert? Wird die DB einzeln nacheinander abgefragt?
Ich versuche nicht gerade, die Wiederholung zu erzwingen/wegzuhacken - wenn es die übliche Django-Art ist, Dinge zu tun, bin ich alle gut! Ich denke einfach, dass ich etwas falsch verstehe und es nicht so djangoisch wie möglich mache. Hilfe sehr geschätzt!
Dank. Ich hatte das Meta-Tag, aber ich denke, es funktioniert nicht, weil es unter dem Rest des Codes lag. Irgendeine Idee, warum 'profile.save()' diese 'UNIQUE Bedingung verursachen konnte, scheiterte: user_profile_profile.user_id' Ausnahme? – Homer
Können Sie die Modelle bitte zeigen – zaidfazil
Haben Sie eine Beziehung mit dem Benutzer in Profiltabelle? – zaidfazil