我使用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']
1条答案
按热度按时间dced5bon1#
在
CreateView
中没有.set_user
方法,因此逻辑永远不会被调用。您可以使用**.form_valid(…)
**[Django-doc]代替:Note:您可以使用**
@login_required
decorator [Django-doc]将视图限制为只对经过身份验证的用户开放。注意:通常使用
settings.AUTH_USER_MODEL
[Django-doc]来引用用户模型比直接使用User
*模型[Django-doc]要好。更多信息请参见文档的 * refering theUser
model 部分。注意:从PEP-3135 [pep]开始,如果第一个参数是在其中定义方法的类,第二个是函数的第一个参数(通常是
self
),则不需要使用参数调用super(…)
。