简体   繁体   English

django 如果没有 model,请重定向到 createview。 如果有,我想在详细视图中做

[英]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?这就是它所说的我该怎么办?

enter image description here在此处输入图像描述

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.

相关问题 Django CreateView - 如果字段为空,则不要创建对象,而是重定向到不同的视图。 我该怎么做呢? - Django CreateView - if field is empty, don't create an object and instead redirect to different view. How do I do this? 我将如何将此功能视图重写为 django 中的通用 CreateView - How would I rewrite this funtional view as a generic CreateView in django Django:如何正确执行CreateView重定向? - Django: How do I perform a CreateView redirect properly? 我未指定Django如何为CreateView选择模板名称 - How does Django choose template name for CreateView when I don’t specify it 如何测试Django CreateView? - How do I test a Django CreateView? 如何在Django中修复我的Createview - How do I fix my Createview in Django 用于通用模型的Django Createview - Django Createview for generic Model 在将关键信息从模型A传递到下一个视图时,如何从模型A的CreateView重定向到模型B的另一个CreateView? - How to redirect from a CreateView of model A to another CreateView of a model B while passing key information from model A to the next view? 为Django管理员详细信息视图添加重定向 - Adding redirect for Django admin detail view 在 Django 中,CreateView 和 UpdateView 是否有默认模板名称? - In Django Do CreateView and UpdateView have a default template name?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM