2015-02-10 3 views
0

Я пытаюсь создать пользовательскую форму для своих пользователей, чтобы они могли редактировать свой профиль.ModelForm с Instance = Session ID

Так что, когда они войти в систему, я сохранить идентификатор пользователя в сессии, и попытаться отобразить пользовательскую форму (сделанный из 3-х классов) с пользовательскими данными внутри, но это не работает ...

forms.py:

class EditUser(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ['first_name', 'last_name'] 

class EditUserProfilePublic(forms.ModelForm): 
    class Meta: 
     model = UserProfilePublic 
     fields = ['website', 'facebook', 'twitter', 'google', 'books_frequency', 'favorite_types_of_books', 'hobbies', 'quote'] 

class EditUserProfilePrivate(forms.ModelForm): 
    class Meta: 
     model = UserProfilePrivate 
     fields = ['address', 'address_bis', 'zipcode', 'city'] 

views.py:

@login_required 
def edit_user(request): 
    if request.method == 'POST': 
     pass 
    else: 
     member = User.objects.get(pk=request.session['user_id']) 
     formUser = EditUser(instance=member) 
     formPublic = EditUserProfilePublic(instance=member) 
     formPrivate = EditUserProfilePrivate(instance=member) 

    return render(request, 'membres/edit_user.html', locals()) 

template.html

<div class="large-6 medium-6 small-12 columns"> 
    <div class="row collapse prefix-radius"> 
     <label for="{{ formPublic.website.id_for_label }}">Site internet</label> 
     <div class="large-2 medium-2 small-2 columns"> 
      <span class="prefix"><i class="fa fa-globe"></i></span> 
     </div> 
     <div class="large-10 medium-10 small-10 columns"> 
      {{ formPublic.website }} 
     </div> 
    </div> 
</div> (and so on) 

models.py:

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    slug = models.SlugField(max_length=30) 
    avatar = models.ImageField(null=True, blank=True, upload_to="avatars/") 

    def __str__(self): 
     return self.user 

class UserProfilePublic(models.Model): 
    FREQUENCY_CHOICES = (
     ('', ''), 
     ('1', 'Moins de 2 romans'), 
     ('2', 'Entre 2 et 5 romans'), 
     ('3', 'Entre 6 et 10 romans'), 
     ('4', 'Plus de 2 romans') 
    ) 

    user = models.OneToOneField(User) 
    website = models.URLField(blank=True) 
    facebook = models.URLField(blank=True) 
    twitter = models.URLField(blank=True) 
    google = models.URLField(blank=True) 
    hobbies = models.CharField(max_length=250, blank=True) 
    books_frequency = models.CharField(max_length=1, choices=FREQUENCY_CHOICES, default='') 
    favorite_types_of_books = models.TextField(blank=True) 
    favorite_books = models.TextField(blank=True) 
    quote = models.CharField(max_length=250, blank=True) 

    def __str__(self): 
     return self.user 

class UserProfilePrivate(models.Model): 
    user = models.OneToOneField(User) 
    address = models.CharField(max_length=250, blank=True) 
    address_bis = models.CharField(max_length=250, blank=True) 
    zipcode = models.CharField(max_length=5, blank=True) 
    city = models.CharField(max_length=30, blank=True) 

    def __str__(self): 
     return self.user 

Моя форма остается пустым без ошибок отображается ... Кстати, я мог использовать инструмент администратора, чтобы сделать такую ​​вещь?

ответ

0

Там нет необходимости хранить идентификатор пользователя в сеансе, или запросить таблицу пользователей с вашей точки зрения. Идентификатор пользователя уже находится в сеансе, потому что это просто то, как работает логин, и поскольку они вошли в систему request.user, это уже соответствующий экземпляр пользователя.

Однако вам необходимо передать фактические экземпляры UserProfilePublic и UserProfilePrivate в соответствующие формы, а не экземпляр пользователя. Итак:

@login_required 
def edit_user(request): 
    formUser = EditUser(instance=request.user) 
    formPublic = EditUserProfilePublic(instance=request.user.userprofilepublic) 
    formPrivate = EditUserProfilePrivate(instance=request.user.userprofileprivate) 

Это предполагает, что ваш класс User имеет отношение один к одному с обеих UserProfilePublic и UserProfilePrivate, и вы не изменили атрибут related_name.

+0

Привет, спасибо за помощь. Где я могу найти все переменные, хранящиеся во время входа? Я попробовал ваше решение, и оно работает для formUser, но не для другого. У меня есть отношения «один к одному» между пользователем и каждым классом «Профиль», но ничего в классе «Пользователь». На самом деле, я не переопределял/не расширил класс User, я создал новые классы с индивидуальным (подумал, что это лучшие практики) –

+0

Я не знаю, что вы имеете в виду «переменные, хранящиеся во время входа» - вам это не нужно, вам просто нужно 'request.user', как я показал. Что именно происходит для других форм? Вы получили сообщение об ошибке? Вам может потребоваться показать определения классов профилей. –

+0

Я редактировал свое первое сообщение, чтобы добавить классы. Ошибка, которую я получаю, - «Пользователь не имеет userprofileprivate». –

0

Экземпляр формы EditUserProfilePublic должен быть экземпляром модели UserProfilePublic, вы передаете экземпляр пользователя. Что-то вроде

formPublic = EditUserProfilePublic (экземпляр = member.userprofilepublic)

И то же самое для EditUserProfilePrivate формы.

-

Смежные вопросы