在Django中编辑UserProfile信息

时间:2017-03-20 17:45:43

标签: django forms validation django-forms user-profile

问题描述:UserProfile表单不保存任何数据。 我正在创建一个新用户并自动为他创建一个UserProfile对象(所以我正在扩展UserProfile),所以我可以进入管理页面并填写所有字段。但是,当我尝试从客户端进行此操作时,我的表单只是没有捕获数据。 最奇怪的时刻是我可以使用UserChangeForm更改用户名和电子邮件,所以我正在尝试对UserProfileObject执行相同操作。

models.py

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    image = models.ImageField(upload_to='profile_image', blank=True)
    title =  models.CharField(max_length=100, default = '')
    first_name = models.CharField(max_length=200, default = '')
    last_name = models.CharField(max_length=200, default = '')
    subject = models.ManyToManyField('Subject', related_name='tutor_type', default = '', help_text="Select a subject")
    AREA_STATUS = (
        ('Jerusalem', 'Jerusalem'),
        ('Tel Aviv', 'Tel Aviv'),
        ('Haifa', 'Haifa'),
        ('Eilat', 'Eilat')
    )
    area = models.CharField(max_length=200, choices=AREA_STATUS, blank=True, default='', help_text='Tutor area')
      # Foreign Key used because tutor can only have one area, but area can have multiple tutors
      # Author as a string rather than object because it hasn't been declared yet in file.
    description = models.TextField(max_length=4000, help_text="Enter a brief description about yourself")
    charge = models.IntegerField(default = '0')
      # ManyToManyField used because Subject can contain many tutors. Tutors can cover many subjects.
      # Subject declared as an object because it has already been defined.
    LANGUAGE_CHOICES = (
        ('English','English'),
        ('Hebrew','Hebrew'),
        ('Russian','Russian'),
        ('French','French'),
        ('Arabic','Arabic'),
    )
    language = models.CharField('Language', choices = LANGUAGE_CHOICES, max_length=50, null=True)

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

    def display_subject(self):
        """
        Creates a string for the subject. This is required to display subject in Admin.
        """
        return ', '.join([ subject.name for subject in self.subject.all()[:3] ])
        display_subject.short_description = 'Subject'

def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])

post_save.connect(create_profile, sender = User)

forms.py:

class EditProfileForm(UserChangeForm):

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

class EditExtendedProfileForm(UserChangeForm):

    class Meta:
        model = UserProfile
        fields = '__all__'
        exclude = ('user',)

views.py

def edit_profile(request):
    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            return redirect(reverse('accounts:view_profile'))
    else:
        form = EditProfileForm(instance=request.user)
        args = {'form': form}
        return render(request, 'accounts/edit_profile.html', args)

def edit_extended_profile(request):
    if request.method == "POST":
        form = EditExtendedProfileForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            return redirect(reverse('accounts:view_profile'))
        else:
            return redirect(reverse('accounts:edit_extended_profile'))
    else:
        form = EditExtendedProfileForm(instance = request.user)
        args = {'form':form}
        return render(request, 'accounts/edit_extended_profile.html', args)

edit_extended_profile.html

{% extends "base.html" %}

{% block head %}
<title>Profile</title>
{% endblock %}

{% block body %}
<div class = "container">
<form method="POST">
  {% csrf_token %}
  {{form.as_p}}
  <button type = "submit" class = "btn btn-success">Submit</button>
</form>
</div>
{% endblock %}

,它与edit_profile视图的模板相同。

没有追溯,没有错误。任何帮助将不胜感激。提前谢谢。

0 个答案:

没有答案