表单,模型和当前用户的更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表单,模型和当前用户的更新相关的知识,希望对你有一定的参考价值。

我认为这可行,但是在使它更有效之前,我遇到了很多事情,我想更好地理解,所以提出了这个问题。看起来其他人也可以通过多种方式查看堆栈溢出时的其他答案。我要避免的是,在创建新的搜索配置文件时,用户必须从下拉菜单中选择用户名。搜索配置文件模型为:

class Search_Profile(models.Model):
    author_of_profile = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,blank=True)
    keyword_string = models.CharField(max_length=200)
    other_stuff = models.CharField(max_length=200)

我最终得到的表格是:

class Search_Profile_Form(ModelForm):
    class Meta:
        model = Search_Profile
        fields = [ 'keyword_string', 'other_stuff']

我故意省略了'author_of_profile',因此不会显示或需要对其进行验证。我尝试隐藏它,但是由于未输入字段,因此表单无法保存到模型中。如果我还好带有下拉菜单,我想我可能会把它留在里面。

测试完整性时,我对html没有任何问题:

  <form action="" method="POST">
    {% csrf_token %}
    {{ form.author_of_profile}}
    {{ form.keyword_string }}
    {{ form.other_stuff }}
    <input type="submit" value="Save and Return to Home Page">
  </form>

[视图是我最终处理表单并将模型分离的地方,首先保存表单,然后更新模型,这是我认为人们可以通过其他方式完成的地方。

def New_Profile(request):
    if request.method=='POST':
        form = Search_Profile_Form(request.POST)
        if form.is_valid():
            post=form.save(commit=False)
            # here is where I thought I could update the author of profile  field  somehow with USER
            # but If I include the author_of_profile field in the form it seems I can't.
            post.save()
            #So instead I tried to update the author_of profile directly in the model
            current_profile=Search_Profile.objects.last()
            current_profile.author_of_profile=request.user
            current_profile.save()
            return(redirect('home'))
    else:
        form=Search_Profile_Form()
    return render(request, 'mainapp/New_Profile.html', {'form': form})

所以有几个问题:对于author_of_profile字段中的外键,最好使用blank = True或null = True我最终使用了request.user而不是从django.contrib.auth.models import导入。User有什么区别?我真正的问题是,上述方法是否是获取表单数据并使用该数据和用户更新数据库的合理方法?还是我错过了更多内置的其他方式?

我认为这可行,但是在使它更有效之前,我遇到了很多事情,我想更好地理解,所以提出了这个问题。看起来其他人也可以通过多种方式来执行此操作...

答案
post=form.save()
current_profile.author_of_profile=request.user
post.save()

return(redirect('home'))

以上是关于表单,模型和当前用户的更新的主要内容,如果未能解决你的问题,请参考以下文章

教程4 - 验证和权限

使用基于类的 UpdateView 在 Django 中更新用户模型

Django REST框架--认证和权限

如何在 django 中使用当前用户的邮件地址初始化电子邮件模型表单

Django:ModelForm 使用自定义查询预填充复选框

Django:更新 X 数量模型的表单