我的作者被自动分配时遇到问题,它以前可以工作,但自从我添加了一些内联表单集后就停止工作了-
这是我的模型:
class Recipe(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
serving = models.PositiveIntegerField(default=1)
temperature = models.PositiveIntegerField(default=1)
prep_time = models.PositiveIntegerField(default=1)
cook_time = models.PositiveIntegerField(default=1)
##tags = models.ManyToManyField('Tag')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def get_absolute_url(self):
return reverse('recipes-detail', kwargs={"pk": self.pk})
def __str__(self):
return self.title
不确定我的其他代码是否可能被覆盖这是我的表单:
如果我在模型中设置blank=True、null=True,它允许表单通过,但没有关联的作者-
class RecipeForm(forms.ModelForm):
class Meta:
model = Recipe
exclude = ['author', 'created_at', 'updated_at']
def __init__(self, *args, **kwargs):
super(RecipeForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_tag = True
self.helper.form_class = 'form-horizontal'
self.helper.label_class = 'col-md-3 create-label'
self.helper.field_class = 'col-md-9'
self.helper.layout = Layout(
Div(
Field('title'),
Field('description'),
Field('temperature'),
Field('serving'),
Field('prep_time'),
Field('cook_time'),
)
)
甚至任何可能的指示引起我的问题将非常有帮助!
非常感谢
Many Thanks
遇到的问题是的表单不包含作者字段,并且没有在视图中明确设置它。
以下是如何解决此问题的步骤:
1. 更新的表单以处理作者字段:
可以选择两种方法:
- 选项 1:在表单中包含隐藏的作者字段:
class RecipeForm(forms.ModelForm):
class Meta:
model = Recipe
exclude = ['created_at', 'updated_at']
widgets = {
'author': forms.HiddenInput()
}
- 选项 2:完全从表单中排除作者字段,并在视图中处理它。 (这是本文中接下来的步骤所采用的方法)
2. 在的视图中设置作者:
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from .models import Recipe
from .forms import RecipeForm
@login_required
def create_recipe(request):
if request.method == 'POST':
form = RecipeForm(request.POST)
if form.is_valid():
recipe = form.save(commit=False) # 不要立即保存
recipe.author = request.user # 设置作者
recipe.save()
return redirect('recipes-detail', pk=recipe.pk)
else:
form = RecipeForm()
return render(request, 'your_app/create_recipe.html', {'form': form})
在这个更新后的视图中:
- 我们首先检查请求方法是否是 POST。
- 我们创建表单实例并使用请求数据对其进行验证。
-
如果表单有效,我们使用
form.save(commit=False)
创建一个 Recipe 实例,但不立即保存。 -
然后,我们手动将当前用户分配给
recipe.author
。 -
最后,我们使用
recipe.save()
保存 Recipe 实例。
其他提示:
-
确保的视图函数有
@login_required
装饰器,以确保只有登录用户才能创建菜谱。 -
不需要在模型中将
author
字段设置为blank=True
或null=True
。
通过这些更改,的 Django 应用程序现在应该能够在创建新食谱时自动分配作者。
标签:python,django From: 78791372