[英]django If don't have a model, Redirect to createview. If there is, I would like to do it in detail view
class KcalDetailView(DetailView):
model = User
context_object_name = 'target_kcal'
template_name = 'kcalculatorapp/detail.html'
def dispatch(self, request, *args, **kwargs):
if not self.request.user.kcal:
return HttpResponseRedirect(reverse('kcalculatorapp:create'))
return super(KcalDetailView, self).dispatch(request, *args, **kwargs)
model.py
class Kcal(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='kcal', null=True)
height = models.PositiveIntegerField(default='', null=False , verbose_name='height')
weight = models.PositiveIntegerField(default='', null=False, verbose_name='weight')
age = models.PositiveIntegerField(default='', null=False, verbose_name='age')
created_at = models.DateField(auto_now_add=True, null=True)
If you go into the detail view,如果您将 go 进入详细视图,
User has no kcal.
error错误
That's what it says What should I do?这就是它所说的我该怎么办?
Your code would work if you would have kcal field on User linking your User to Kcal.如果您在用户上有 kcal 字段将您的用户链接到 Kcal,那么您的代码将起作用。 If you are trying to get object with one to one relation by related name in Django and object does not exist, ObjectDoesNotExist exception is raised.
如果您试图通过 Django 和 object 中的相关名称获得具有一对一关系的 object 不存在,则会引发 ObjectDoesNotExist 异常。 What you should do is embed your redirect in try... except... block like that:
您应该做的是将重定向嵌入到 try... except... 块中:
try:
self.request.user.kcal:
except ObjectDoesNotExist:
return HttpResponseRedirect(reverse('kcalculatorapp:create'))
Of course you could do Kcal.ObjectDoesNotExist but i don't know your project structure if it would not cause circle import error当然你可以做 Kcal.ObjectDoesNotExist 但我不知道你的项目结构是否不会导致圆圈导入错误
Firstly, you should override the get
method instead of the dispatch method
and use getattr
to check for a Kcal
relation.首先,您应该重写
get
方法而不是 dispatch method
,并使用getattr
检查Kcal
关系。
class KcalDetailView(DetailView):
...
def get(self, request, *args, **kwargs):
if not getattr(self.request.user, 'kcal', None):
return HttpResponseRedirect(reverse('kcalculatorapp:create'))
return super().get(request, *args, **kwargs)
And since you are relying on authentication rather than url kwargs to determine the object to return, you need to override the get_object
method as well.而且由于您依靠身份验证而不是 url kwargs 来确定要返回的 object,因此您还需要覆盖
get_object
方法。
class KcalDetailView(DetailView):
...
def get_object(self, queryset=None):
return self.request.user.kcal
So your final view should look something like this:所以你的最终视图应该是这样的:
class KcalDetailView(DetailView):
context_object_name = 'target_kcal'
template_name = 'kcalculatorapp/detail.html'
def get_object(self, queryset=None):
return self.request.user.kcal
def get(self, request, *args, **kwargs):
if not getattr(self.request.user, 'kcal', None):
return HttpResponseRedirect(reverse('kcalculatorapp:create'))
return super().get(request, *args, **kwargs)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.