在Django中更新配置文件模型对象

时间:2018-03-09 20:20:36

标签: python django object models

我进行了搜索和搜索,试图找出我的问题或我需要在这里做些什么。我是Django的新手,并没有让用户通过表单更改数据库的模型对象。

我的代码正在做的是每当用户使用以下代码注册时创建默认的“个人资料”数据库:

Models.py:

    class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    state = models.CharField(max_length= 20, choices=STATE_CHOICES,default='N/A',)
    city = models.CharField(max_length=30,null=True, blank=True)
    birth_date = models.DateField(null=True, blank=True)
    Primary_Campaign_Interest = models.CharField(max_length=30, choices=Interest_choices, null='000')
    Secondary_Campaign_Interest = models.CharField(max_length=30, choices=Interest_choices, null='000')

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

这会在我的数据库中生成一个空表,我希望用户能够通过表单进行编辑。但是,我只希望用户能够编辑州和城市字段以及一些用户字段,而不是用户名。

forms.py

class ProfileForm(forms.ModelForm):
class Meta:
    model = Profile
    fields = ('state','city')

views.py

@login_required
@transaction.atomic
def update_profile(request):
    if request.method == 'POST':
        user_form = SignUpForm(request.POST, instance=request.user)
        profile_form = ProfileForm(request.POST, instance=request.user.profile)
        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(request, _('Your profile was successfully updated!'))
            return redirect('home')
        else:
            return render(request, 'Users/profile.html')
    else:
        user_form = SignUpForm(instance=request.user)
        profile_form = ProfileForm(instance=request.user.profile)
    return render(request, 'accounts/profile.html', {
        'user_form': user_form,
        'profile_form': profile_form
    })

账户/ profile.html

    <form method="post">{% csrf_token %}
  <h3>First name:</h3>
  {{ user_form.first_name }}<br>
  <h3>Last name:</h3>
  {{ user_form.last_name }}<br>
  <h3>Email Address:</h3>
  {{ user_form.email }}<br>
  <h3>State:</h3>
  {{ profile_form.state }}<br>
  <h3>City:</h3>
  {{ profile_form.city}}<br>
  <h3>Primary Campaign Interest:</h3>
  {{ profile_form.Primary_Campaign_Interest}}<br>
  <h3>Secondary Campaign Interest:</h3>
  {{profile_form.Secondary_Campaign_Interest}}<br>
  <button type="submit">Save changes</button>
</form>

我认为我的问题是,只要用户提交这些表单,表单就无效并返回页面Users / Profile.html。关于使表格有效的任何建议?还是编辑数据库中已有对象的更好方法?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我个人认为你应该把你的任务分成两个任务。首先,您创建一个新用户(您的注册表单),将其保存到数据库(任务1)。如果保存成功,那么您可以使用更新视图从数据库中查询该用户,然后更新并保存(任务2)。

答案 1 :(得分:0)

早些时候弄清楚了。我刚创建了一个新表单,将其传递给视图,然后将初始值设置为当前在模型对象中的值。 同样重要的是要注意用户实例的使用。

@login_required
def signuptwo(request):
    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user.profile)
        profile = form.save(commit=False)
        profile.user = request.user
        if form.is_valid():
            form.save()
            return redirect('profile')
    else:
        user_profile = Profile.objects.get(user=request.user)
        form = EditProfileForm(initial={'state':user_profile.state,'city':user_profile.city,'birth_date':user_profile.birth_date,'Primary_Campaign_Interest':user_profile.Primary_Campaign_Interest,'Secondary_Campaign_Interest':user_profile.Secondary_Campaign_Interest})
        return render(request, 'Accounts/Editprofile.html', {'form':form})

感谢您的帮助!