(Django CBV)需要将对象附加到CBV用户

46scxncf  于 2023-01-31  发布在  Go
关注(0)|答案(1)|浏览(120)

我使用FBV实现了这个功能,但是当我尝试使用CBV时,对象被创建为空用户字段。
views.py

class BlockCreate(CreateView):
    model = TrainingBlock
    template_name = 'training_room/create_block.html'
    form_class = BlockForm
    success_url = reverse_lazy('gym')
    
    def set_user(self, form):
        form.instance.user = self.request.user
        return super(BlockCreate, self).set_user(form)

models.py

class TrainingBlock(models.Model):
     user = models.ForeignKey(User, on_delete=models.CASCADE)
     name = models.CharField(max_length=30)
     duration = models.IntegerField(default=10)
     if_ended = models.BooleanField(default=False)
     
     def __str__(self):
          return self.name

forms.py

class BlockForm(forms.ModelForm):
    class Meta:
        model = TrainingBlock
        fields = '__all__'
        exclude = ['user']
dced5bon

dced5bon1#

CreateView中没有.set_user方法,因此逻辑永远不会被调用。您可以使用**.form_valid(…)**[Django-doc]代替:

from django.contrib.auth.mixins import LoginRequiredMixin

class BlockCreate(LoginRequiredMixin, CreateView):
    model = TrainingBlock
    template_name = 'training_room/create_block.html'
    form_class = BlockForm
    success_url = reverse_lazy('gym')

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

Note:您可以使用**@login_requireddecorator [Django-doc]将视图限制为只对经过身份验证的用户开放。
注意:通常使用
settings.AUTH_USER_MODEL[Django-doc]来引用用户模型比直接使用User*模型[Django-doc]要好。更多信息请参见文档的 * refering the User model 部分。
注意:从PEP-3135 [pep]开始,如果第一个参数是在其中定义方法的类,第二个是函数的第一个参数(通常是self),则不需要使用参数调用super(…)

相关问题