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

Python Django-如何在填写表单时自动关联用户,python,django,django-models,django-forms,django-views,Python,Django,Django Models,Django Forms,Django Views,所以我正在尝试创建博客应用程序。在这篇文章中,我创建了一个保存用户提交的模型帖子。我还创建了一个表单,用于将用户输入到Post中。我面临的问题是,在获取输入时,我无法自动关联登录用户的id model.py: from django.db import models from django.contrib.auth.models import User from django.urls import reverse class Post( models.Model): title =

所以我正在尝试创建博客应用程序。在这篇文章中,我创建了一个保存用户提交的模型帖子。我还创建了一个表单,用于将用户输入到Post中。我面临的问题是,在获取输入时,我无法自动关联登录用户的id

model.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()
为了暂时解决这个问题,我找到了一个选项,可以让用户从用户名列表中进行选择

form.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'}),
        }
view.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函数绕过此函数,但渲染它时会出现“relatedObjectsDoesNotExist post无作者”错误


你能帮我解决这个问题吗?谢谢

用户必须先登录。然后可以像这样重写该方法

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
班级职务(models.Model):


非常感谢你的回答。它确实非常有效,但它有点搞砸了在我的表单中出现的字段的排序。我正在使用代码片段{form.as_p}和post方法。你能建议一种正确订购表格的方法吗?在表格中,我得到的是身体的输入,而不是标题的输入。
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()