如何使用Django Forms更新扩展用户模型?

时间:2017-02-28 15:47:07

标签: python django

我是Django的新手,需要帮助。

我想允许用户使用表单更新他们的帐户数据,但是很难将Django User模型与我的UserProfile模型相关联,后者扩展了默认模型以及一些额外的字段。

我发现,该解决方案是创建自己的模型表单,但遗憾的是我并不确定如何实现它。

models.py:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    description = models.CharField(max_length=100, default='')
    city = models.CharField(max_length=100, default='')
    website = models.URLField(default='')
    phone = models.IntegerField(default=0)
    image = models.ImageField(upload_to='profile_image', blank=True)

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

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):
    image = forms.ImageField(required=False)
    city = forms.CharField(required=False)

    class Meta:
        model = User
        fields = (
            'email',
            'first_name',
            'last_name',
            'password',
            'image',
            'city'
        )

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)

edit_profile.html:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Submit</button>
</form>

1 个答案:

答案 0 :(得分:0)

您正在寻找Inline formsets。只需阅读文档,这很简单。