代码之家  ›  专栏  ›  技术社区  ›  user2896120

在Django中创建更新或创建窗体视图

  •  0
  • user2896120  · 技术社区  · 6 年前

    我有一个叫 profile 它与 User 模型。 轮廓 包含有关用户的不必要信息,如个人信息、性别、国家等,因此当用户注册时,他们还没有配置文件。当用户进入设置并开始输入详细信息时,他们将有一个配置文件。

    也就是说,如何在Django中创建一个既可以创建有关用户的配置文件详细信息,也可以更新现有信息的视图。

    形式

    class ProfileForm(ModelForm):
        class Meta:
            model = Profile
            fields = ['avatar', 'bio', 'gender', 'dob', 'country']
    

    视图

    class SettingsView(FormView):
        template_name = 'oauth/settings.html'
        form_class = ProfileForm
        success_url = reverse_lazy('oauth:settings')
        redirect_field_name = "next"
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Ahtisham    6 年前

    试试这个:

    from django.views import View
    from .forms import ProfileForm
    from .models import Profile
    
    class Settings(View):
       form_class = ProfileForm
       template_name = 'oauth/settings.html'
    
       def post(self, request):
          form = self.form_class(request.POST)
          data = {'error':''}
          if form.is_valid():
              user = request.user
              bio = form.cleaned_data['bio']
              # more fields here
              try:
                 profile = user.profile
                 # update user profile
                 profile.bio = bio
                 # add more fields here
                 profile.save()
                 data['response'] = 'profile updated!'
              except:
                 profile = Profile(user=user,bio=bio) #add more fields
                 profile.save()
                 data['response'] = 'profile created!'
         else:
            data['error'] = 'Invalid form!'
         return render(request, self.template_name,{'data':data})
    

    编辑:

    或者我们可以使用 update_or_create() 正如OP在评论中建议的那样。

    通过替换 try except 块与:

    updated_values = {'bio':bio} # add more fields
    obj, created = Profile.objects.update_or_create(user=user,bio=bio, defaults=updated_values) # add more fields
    if created:
       data['response'] = 'profile created!'
    else:
       data['response'] = 'profile updated!'