Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django编辑用户配置文件_Django_Edit_Profile - Fatal编程技术网

Django编辑用户配置文件

Django编辑用户配置文件,django,edit,profile,Django,Edit,Profile,我正在尝试在前面创建一个“编辑配置文件”表单。结果是,我的表单(我不是100%确定)尝试创建一个用户,而不是查找当前用户并更新其配置文件。所以我认为这就是问题所在。在这里检查了许多问题,但没有一个问题足够清楚。我试图编辑的字段是email、first name和last name。(我还要补充一点。) forms.py class UpdateProfile(forms.ModelForm): username = forms.CharField(required=True) e

我正在尝试在前面创建一个“编辑配置文件”表单。结果是,我的表单(我不是100%确定)尝试创建一个用户,而不是查找当前用户并更新其配置文件。所以我认为这就是问题所在。在这里检查了许多问题,但没有一个问题足够清楚。我试图编辑的字段是email、first name和last name。(我还要补充一点。)

forms.py

class UpdateProfile(forms.ModelForm):
    username = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    first_name = forms.CharField(required=False)
    last_name = forms.CharField(required=False)

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

    def clean_email(self):
        username = self.cleaned_data.get('username')
        email = self.cleaned_data.get('email')

        if email and User.objects.filter(email=email).exclude(username=username).count():
            raise forms.ValidationError('This email address is already in use. Please supply a different email address.')
        return email

    def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.email = self.cleaned_data['email']

        if commit:
            user.save()

        return user
views.py

def update_profile(request):
    args = {}

    if request.method == 'POST':
        form = UpdateProfile(request.POST)
        form.actual_user = request.user
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('update_profile_success'))
    else:
        form = UpdateProfile()

    args['form'] = form
    return render(request, 'registration/update_profile.html', args)

非常接近。实例化表单时,需要将要修改的
用户
对象作为
实例
参数传递

从文档中:

ModelForm的子类可以接受现有模型实例作为 关键字参数
实例
;如果提供了该参数,则save()将更新 那个例子

在您的代码中,它看起来像:

form = UpdateProfile(request.POST, instance=request.user)
if form.is_valid():
    ...

您可以在此处签出更多信息:

或者,如果您想使用基于类的视图方式,使用UpdateView,您可以在views.py中执行类似操作:

class UpdateProfile(UpdateView):
    model = MyProfile
    fields = ['first_name', 'last_name', 'image', 'url', 'biography', '...'] # Keep listing whatever fields 
    # the combined UserProfile and User exposes.
    template_name = 'user_update.html'
    slug_field = 'username'
    slug_url_kwarg = 'slug'
在models.py中,MyProfile有如下内容:

class MyProfile(AbstractUser):
    image = models.ImageField(upload_to='uploads/profile/')
    url = models.URLField()
    biography = models.CharField(max_length=1000)
和您的url.py类似(假设您使用django allauth并希望遵守url约定):

。。。。
url(r'^accounts/update/(?P[\-\w]+)/$),views.UpdateProfile.as\u view(),name='update\u user'),
....
剩下的是Django乐趣!我建议您为基本CRUD任务编写更少的代码,除非确实需要做一些自定义的事情,即使您仍然可以通过扩展基于类的视图来摆脱这种情况


如果您想了解更多信息,请参见此处:

在这种情况下,从基于类的视图中查看UpdateView可能会容易得多。我知道这在不久前就得到了回答,但如果您能解释slug,那就太好了。顺便说一句,回答得很好。@Almosta初学者也许这会有所帮助:我确实读过,我理解slug是什么,但我不理解我想通过你的方法实现同样的目标,但不断地出错。我会发布对我有用的东西。
....
url(r'^accounts/update/(?P<slug>[\-\w]+)/$', views.UpdateProfile.as_view(), name='update_user'),
....