我正在从基于函数的视图转移到基于类的视图,但在数据库中保存user时遇到了一些问题.

我设法让它在我的基于函数的视图中工作(经过一些try !):

# def create_post(request, *args, **kwargs): #function based view for creating a post - this works
#     if request.method == "POST":
#         form = PostForm(request.POST)
#         if form.is_valid():
#             post = form.save(commit=False)
#             post.author = request.user
#             post.save()
#             messages.success(request, "Post submitted!")
#             form = PostForm()
#     else:
#         form = PostForm()
#
#     context = {
#         'form': form
#     }
#     return render(request, "create_post.html", context)

但在执行基于类的视图时无法使其工作.

创建后视图:

class CreatePostView(CreateView):
    model = Post
    form_class = PostForm
    template_name = "create_post.html"

POST模型:

class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, default=None, null=True)
    title = models.CharField(max_length=100)
    slug = models.SlugField()
    description = models.TextField(max_length=500)
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("posts:post_detail", args=(str(self.id),))

张贴表格:

class PostForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.fields['title'].label = ""
        self.fields['description'].label = ""


    class Meta:
        model = Post
        fields = ['title', 'description']
        widgets = {
            'title': forms.TextInput(attrs={'class': "title w-full bg-gray-100 border border-gray-300 p-2 mb-4 outline-none",
                                            'spellcheck': "false", 'placeholder': "Title", 'type': "text"}),
            'description': forms.Textarea(attrs={'class': "description w-full bg-gray-100 sec p-3 h-60 border border-gray-300 outline-none",
                                                 'spellcheck': "false", 'placeholder': "Describe everything about this post here", 'type': "text"}),
        }

    def save(self, *args, **kwargs):
        obj = form.save(commit=False)
        obj.user = request.user
        obj.save()

我认为问题出在save方法中,我真的不明白我需要在这里做些什么才能将我的用户保存在我的模型中.使用基于函数的视图,我只需抓取用户的request.user并将其保存为我的post.author.

推荐答案

您可以重写.form_valid(…) [Django-doc]以在表单有效时、保存表单并进行重定向之前运行:

class CreatePostView(CreateView):
    model = Post
    form_class = PostForm
    template_name = 'create_post.html'

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

Note:可以将视图限制为基于类的视图,只有经过身份验证的用户才能使用 LoginRequiredMixin mixin [Django-doc].

Django相关问答推荐

如何在Django模板中获取组中对象的整体计数器(&Q;)?

Pytest-django - 测试创建和传递所需的用户对象

在 Django Rest Framework 视图中,request.user 是在请求​​到达视图之前进行数据库调用还是数据库调用发生?

Django `UniqueConstraint` 异常处理方式与 'unique=True' 相同

Django 身份验证系统修改

如何让 Django 在模板更改时重新启动运行服务器?

将计数字段添加到 django rest 框架序列化程序

可插拔应用程序的Django默认设置约定?

根据模型属性获取django对象id

Django 管理命令参数

断开模型的信号并在 django 中重新连接

如何在终端中切换 Python 版本?

django.core.exceptions.ImproperlyConfigured:请求设置 USE_I18N,但未配置设置

has_object_permission 和 has_permission 有什么区别?

单击弹出框会滚动回页面顶部 [Bootstrap 和 Django]

如何覆盖 django 管理员翻译?

django-rest-framework 接受 JSON 数据?

Django Admin - save_model 方法 - 如何检测字段是否已更改?

左加入 Django ORM

Django 字符串到日期格式