如果视图来自不同的网址,如何执行不同的视图?

时间:2019-07-03 15:24:21

标签: python django view

所以我想在Django中创建一个消息应用程序。有一个用于删除消息的视图。如果用户单击删除,它将仅隐藏消息。如果执行,它将消息“ hide”的布尔值字段更改为True。

我有两个不同的模板,收件箱和发件箱。我想要这些摊位的删除功能。但是要使用相同的视图。我只想检查请求是否来自发件箱,那么我将更改为to_hide。如果请求来自收件箱,我将更改frm_hide。但是我不知道如何在视图中捕获URL并限制它们执行其他功能。

消息模型


class Msgs(models.Model):
    to = models.ForeignKey(User, on_delete=models.CASCADE, related_name='to_user')
    frm = models.ForeignKey(User, on_delete=models.CASCADE, related_name='from_user')
    title = models.CharField(max_length = 255)
    body = models.CharField(max_length=2000)
    date = models.DateTimeField(auto_now=True)
    to_hide = models.BooleanField(default=False)
    frm_hide = models.BooleanField(default=False)


    def __str__(self):
        return f'{self.frm} to {self.to}: {self.title}'


## Delete/Hide View

@login_required
def deletemsg(request, msg_id):
    msg = Msgs.objects.get(pk=msg_id)
    msg.frm_hide = True
    msg.save()
    return redirect('/msgs/inbox/')

# inbox url: http://127.0.0.1:8000/msgs/inbox/
# outbox url: http://127.0.0.1:8000/msgs/outbox/


2 个答案:

答案 0 :(得分:0)

在您的urls.py中,您可以提供变量对象view_type

urlpatterns = [
    ...
    url(r'msgs/(?P<view_type>(inbox|outbox))/$', views.deletemsg),
]

然后您可以在视图中获取此参数

def deletemsg(request, view_type, msg_id):
    msg = Msgs.objects.get(pk=msg_id)
    # do what you want depends on view_type
    if view_type == 'inbox':
        msg.frm_hide = True
    else:
        msg.to_hide = True

    msg.save()
    return redirect('/msgs/inbox/')

答案 1 :(得分:0)

假设您的urls.py

urlpatterns = [
    path('msg/<int:msg_id>/<str:msg_type>/', deletemsg, name='inbox-outbox)
]

views.py

@login_required
def deletemsg(request, msg_id, msg_type):
    msg = Msgs.objects.get(pk=msg_id)
    if msg_type == 'inbox':
        msg.frm_hide = True
        return redirect('your-desired-url')
    if msg_type == 'outbox':
        msg.to_hide = True
        return redirect('your-desired-url')
    # use the following if you redirect to same page for either inbox/outbox. In this case don't use the above two return statement
    # return redirect('your-desired-url')
    raise Http404 # import this before use