2017-07-04 2 views
0

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!

Antwort

3

Sie könnten Meta Klasse zu Ihrem Formular hinzufügen, und ModelForm würde sich um den Rest kümmern.

forms.py,

class ProfileForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     exclude = ('user',) 

views.py,

def profile_edit(request): 
    if request.method == 'POST': 
     form = ProfileForm(request.POST) 

     if form.is_valid(): 
      form.instance.user = request.user 
      form.save() 
      return redirect('/profile/edit') 
    else: 
     form = ProfileForm(instance=request.user.profile) 
    context = { 
     'user': request.user, 
     'form': form, 
    } 
    return render(request, 'profile_edit.html', context) 
+0

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

+0

Können Sie die Modelle bitte zeigen – zaidfazil

+0

Haben Sie eine Beziehung mit dem Benutzer in Profiltabelle? – zaidfazil

Verwandte Themen