首页 > 编程问答 >Django 自动将作者分配给创建帖子的用户

Django 自动将作者分配给创建帖子的用户

时间:2024-07-25 11:47:56浏览次数:10  
标签:python django

我的作者被自动分配时遇到问题,它以前可以工作,但自从我添加了一些内联表单集后就停止工作了-

这是我的模型:

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

相关文章