2016-12-04 1 views
0

Ich versuche, ein Bearbeitungsformular für vorhandene Benutzer zu erstellen, ich habe das Benutzermodell und ich ihm ein Profil zugeordnet. Das Problem ist, dass die Felder des Profils leer sind im gerenderten HTML, aber wenn ich einen neuen Benutzer erstellt habe, füllte ich diese Felder, und wenn ich zur Verwaltung gehe, finde ich, dass die Felder gefüllt sind.
enter image description here models.pyKann Daten in Bearbeitungsformular nicht erhalten

from django.db import models 
from django.contrib.auth.models import User 


class Profile(models.Model): 
    DEPARTMENT_CHOICES = (('MI', 'Math et info'), 
          ('ST', 'Science et Tech'), 
          ('SM', 'Science de la matiere')) 

    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    teacher = models.BooleanField(default=False) 
    description = models.TextField(blank=True) 
    department = models.CharField(max_length=35, choices=DEPARTMENT_CHOICES, blank=True) 
    picture = models.ImageField(upload_to='profile-images', blank=True) 

    def __str__(self): 
     return self.user.username 


views.py

def profile_view(request): 
    if request.method == 'POST': 
     user_form = EditUserForm(request.POST, instance=request.user) 
     ins = Profile.objects.get(pk=5) 
     profile_form = EditProfileForm(request.POST, request.FILES, instance=ins) 

     if user_form.is_valid() and profile_form.is_valid(): 
      user = user_form.save() 
      user.save() 

      profile = profile_form.save(commit=False) 
      profile.user = user 

      if 'picture' in request.FILES: 
       profile.picture = request.FILES['picture'] 

      profile.save() 
      return redirect(home) 
    else: 
     user_form = EditUserForm(instance=request.user) 
     profile_form = EditProfileForm(request.FILES, instance=request.user) 

    return render(request, 'account/profile.html', {'user_form': user_form, 
                'profile_form': profile_form}) 


forms.py

class EditProfileForm(forms.ModelForm): 

    class Meta: 
     model = Profile 
     fields = ('description', 'department', 'picture',) 


class EditUserForm(forms.ModelForm): 

    class Meta: 
     model = User 
     fields = ('username', 'email',) 


profile.html

{% extends 'manhal/base.html' %} 
{% load staticfiles %} 
{% load crispy_forms_tags %} 

{% block content %} 

    <div class="col-md-6"> 

      <form method="post" enctype="multipart/form-data" action="{% url 'profile' %}" class="form-horizontal">{% csrf_token %} 

       <fieldset> 
        <legend>User Profile</legend> 

        {{ user_form|crispy }} 
        {{ profile_form|crispy}} 
        <input type="submit" value="Save" class="btn btn-primary"> 
       </fieldset> 
      </form> 

    </div> 
{% endblock %} 
+1

Übergeben Sie request.POST nicht im Else-Block. –

+0

funktioniert immer noch nicht –

Antwort

1

Zuerst prüft Ihr if/else Block, ob die Anfrage eine POST ist. Da der else Block kein POST ist, möchten Sie keine POST Daten in Ihrem Formular übergeben. Dadurch wird das Formular davon überzeugt, dass es ohne Daten gebunden ist.

Auch sieht es aus wie Sie die request.user auf Ihre ProfileForm als Beispiel sind vorbei, aber das Modell auf der ProfileForm Meta-Klasse ist ein Profile Objekt erwartet.

Können Sie diese beiden Dinge reparieren und sehen, ob es funktioniert oder nicht? Wenn es nicht funktioniert, poste bitte etwas mehr Code (wie deine Vorlagen).

+0

Ich habe getan, was Sie mir gesagt haben, aber immer noch nicht funktioniert. @Esteban –

+1

Sie müssen auch die 'request.Files' entfernen und die richtige Instanz übergeben: ' profile_form = EditProfileForm (instance = request.user.profile) ' – Esteban

+0

Danke, es funktioniert jetzt. –

Verwandte Themen