Python Django模型和视图

Python Django模型和视图,python,django,Python,Django,我正在尝试创建我的第一个项目。比如关于特定主题的问题和答案。我通过AbstractBaseUser创建自己的用户。现在我想创建问答模型 我的模型: class Question(models.Model): text = models.TextField() title = models.CharField(max_length=200) date = models.DateTimeField(default=datetime.datetime.now) author = models.For

我正在尝试创建我的第一个项目。比如关于特定主题的问题和答案。我通过AbstractBaseUser创建自己的用户。现在我想创建问答模型

我的模型:

class Question(models.Model):

text = models.TextField()
title = models.CharField(max_length=200)
date = models.DateTimeField(default=datetime.datetime.now)
author = models.ForeignKey(CustomUser)
def __str__(self):
    return self.title
课堂答案(models.Model):

类标记(models.Model):

我的看法:

def question(request):

args = {}
args.update(csrf(request))
args['form'] = QuestionForm()
args['profile'] = CustomUser.objects.filter(pk = request.user.pk)
args['author'] = Question()

if request.POST:
    args['form'] = QuestionForm(request.POST)
    obj = args['form'].save(commit=False)
    obj.save()
    args['author'].author = args['profile']
    args['author'].save()
    return redirect(reverse(question))

return render(request, 'questions.html', args)
我为答案创建了第一个视图,发送表单时出错:

列“author\u id”中的null值违反了not null约束


我想我走错方向了。我的模特和视角都不好。为什么会出现此错误以及我的模型有什么问题?

对于外键字段,可以使用null

class Question(models.Model):

    #...
    author = models.ForeignKey(CustomUser, null = True, blank = True)
否则,首先在保存模型时指定author的值,这是错误的。我无法理解
args['author']=Question()
的意思是什么?你应该做些符合法律的事情

args['author'] = CustomUser() # in your question view

相反。

如果您的业务规则不允许问题的作者为空,则必须在保存之前将作者值设置为obj。 比如:

def question(request):

    args = {}
    args.update(csrf(request))
    args['form'] = QuestionForm()
    args['profile'] = CustomUser.objects.filter(pk = request.user.pk)

    if request.POST:
        args['form'] = QuestionForm(request.POST)
        obj = args['form'].save(commit=False)
        obj.author = args['profile']
        obj.save()
        return redirect('your_redirect_url')

    return render(request, 'questions.html', args)
def question(request):

    args = {}
    args.update(csrf(request))
    args['form'] = QuestionForm(initial={
        'author': CustomUser.objects.filter(pk = request.user.pk)    
    })

    if request.POST:
        args['form'] = QuestionForm(request.POST)
        obj = args['form'].save()
        return redirect('your_redirect_url')

    return render(request, 'questions.html', args)
您还有另一个选择: 您可以将以下内容的初始词典传递到问题表单:

{
    'author' : CustomUser.objects.filter(pk = request.user.pk)
}
比如:

def question(request):

    args = {}
    args.update(csrf(request))
    args['form'] = QuestionForm()
    args['profile'] = CustomUser.objects.filter(pk = request.user.pk)

    if request.POST:
        args['form'] = QuestionForm(request.POST)
        obj = args['form'].save(commit=False)
        obj.author = args['profile']
        obj.save()
        return redirect('your_redirect_url')

    return render(request, 'questions.html', args)
def question(request):

    args = {}
    args.update(csrf(request))
    args['form'] = QuestionForm(initial={
        'author': CustomUser.objects.filter(pk = request.user.pk)    
    })

    if request.POST:
        args['form'] = QuestionForm(request.POST)
        obj = args['form'].save()
        return redirect('your_redirect_url')

    return render(request, 'questions.html', args)

注意:在questions.html模板中呈现作者值的隐藏字段非常重要,因此它包含在帖子数据中。

谢谢。我在视图
args['profile']=CustomUser.objects.get(pk=request.user.pk)
中更改了我的模型和这一行,当我发送表单时,字段Question.author是非更改模型不是正确的解决方案,因为我认为问题必须有作者。然后指定作者,正如我在“否则”中提到的那样在创建问题之前,您需要创建作者并与表单问题关联。感谢像您这样的人。我可以教Django开发!我认为你的模型是对的。我唯一不同的做法是将ManyToMany字段放在问题模型中,而不是Tag(我认为最好用单数命名模型)。意思完全一样,但是说“一个问题有标签”比说“一个标签有问题”更自然。此外,如果您使标记模型独立于问题模型,您还可以在答案模型中添加许多要标记的字段,从而允许“标记”答案。太棒了!非常感谢您的详细回答。我认为最有用的方法是让用户键入字符串列表(可能是逗号分隔的)。在表单中,创建一个干净的标记(将表单字段命名为“标记”),处理这个大字符串,将其拆分为候选标记。对于每一个标记,找出是否已经存在具有相同内容的标记(如果存在,请使用它),并为不存在的字符串创建新标记。如果您还添加了一个类型先行函数,在用户键入的同时查询数据库以查找匹配的标记,并允许用户选择其中一个结果,则使用起来更容易,同时也避免人们创建与现有标签等效的新标签。