繁体   English   中英

Django - 如何在填写表单时自动关联用户

[英]Django - how to automatically associate user while filling the form

所以我正在尝试创建博客应用程序。 在此,我创建了一个模型 Post,其中包含用户提交的内容。 我还创建了一个表单来获取用户对 Post 的输入。 我面临的问题是我无法在获取输入时自动关联引用的登录用户 ID。

模型.py:

from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse

class Post( models.Model):

    title = models.CharField( max_length = 225 )
    title_tag = models.CharField(max_length=225)
    author = models.ForeignKey( User , on_delete=models.CASCADE )
    body = models.TextField()

为了暂时解决这个问题,我找到了一个选项,可以让用户从用户名列表中进行选择

表单.py

from django import forms
from .models import Post

class PostForm ( forms.ModelForm):
    class Meta :
        model = Post
        fields = {'title','title_tag', 'author','body'}

        widgets = {
            'title' : forms.TextInput( attrs= {'class' : 'form-control', 'placeholder':'please write yur title'}),
            'title_tag' : forms.TextInput(attrs={'class': 'form-control'}),
            'author': forms.Select(attrs={'class': 'form-control'}),
            'body': forms.Textarea(attrs={'class': 'form-control'}),
        }

视图.py:

class CreatePost ( CreateView):
    model = Post
    form_class = PostForm
    template_name= 'create_post.html'
    #fields  = '__all__'

def create_post(request) :

    form = Post (request.POST or None)
    context = {
        'form_': form
    }

    if request.method == 'POST':

        if form.is_valid():
            publish = form.save(commit=False)
            #publish.author = request.user
            publish.save()

    return render(request, 'create_p.html', context )

我使用类 CreatePost 来呈现这个视图。 它有效,但问题是我必须选择手动关联 Post 对象的用户。 我试图使用函数 create_post 绕过它,但渲染它给我“RelatedObjectDoesNotExist Post has no author”错误。

能否请您指导我这个问题谢谢!

用户必须先登录。 然后你可以像这样覆盖form_valid方法。

class CreatePost(LoginRequireMixin, CreateView):
    model = Post
    form_class = PostForm
    template_name= 'create_post.html'
    #fields  = '__all__'

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

此外,您需要从表单中删除字段author作为必填字段,因为您是在视图中自己处理此字段。

class PostForm(forms.ModelForm):
    class Meta :
        model = Post
        fields = ['title','title_tag','body']

首先,用户必须与模型相关联,所以尝试

from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse

类邮政(模型。模型):

user = models.ForeignKey(User, on_delete=models.CASCADE,related_name="user",null=True)
title = models.CharField( max_length = 225 )
title_tag = models.CharField(max_length=225)
author = models.ForeignKey( User , on_delete=models.CASCADE )
body = models.TextField()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM