代码之家  ›  专栏  ›  技术社区  ›  TM. Randy Simon

Django模板:创建“返回”链接?

  •  17
  • TM. Randy Simon  · 技术社区  · 16 年前

    我正在和你一起工作 Django 我想知道是否有一种简单的方法可以使用模板系统创建到上一页的“返回”链接。

    我检查了Django模板文档,但没有看到任何明确提到这一点的内容。

    7 回复  |  直到 16 年前
        1
  •  47
  •   rnevius    8 年前

    实际上是 go(-1) .

    <input type=button value="Previous Page" onClick="javascript:history.go(-1);">
    
        2
  •  42
  •   Pegasus    10 年前

    <a href="{{request.META.HTTP_REFERER}}">Go back</a>
    

    'django.core.context_processors.request', TEMPLATE_CONTEXT_PROCESSORS 在项目的设置中。

        3
  •  12
  •   Oli    16 年前

    'django.core.context_processors.request',
    

    在你的 settings.TEMPLATE_CONTEXT_PROCESSORS 阻止和勾引推荐人,但这有点恶心,可能会打破所有的地方。

    在大多数你想要的地方(比如编辑文章页面),你都有一个真实的对象(在这个例子中,就是文章),这样你就可以很容易地找出正确的前一页应该是什么。

        4
  •  9
  •   Kermit    4 年前
    <a href="{{request.META.HTTP_REFERER|escape}}">Back</a>
    

    |escape 是用来摆脱困境的 " "

        5
  •  3
  •   ceruleus    8 年前

    您始终可以使用非常简单的客户端选项:

    <a href="javascript:history.go(1)">Back</a>
    
        6
  •  3
  •   Carlo Ledesma    5 年前

    对于RESTful链接,“后退”通常意味着更高一级:

    <a href="../"><input type="button" value="Back" class="btn btn-primary" /></a>
    
        7
  •  0
  •   Erasmo    8 年前

    对于Django admin的change forms中的“back”按钮,我最终要做的是一个自定义模板过滤器,用于解析和解码模板中的“preserved_filters”变量。我将以下内容放在自定义模板/admin/submit_line.html文件中:

    <a href="../{% if original}../{% endif %}?{{ preserved_filters | decode_filter }}">
        {% trans "Back" %}
    </a>
    

    然后创建了一个自定义模板过滤器:

    from urllib.parse import unquote
    from django import template
    
    def decode_filter(variable):
        if variable.startswith('_changelist_filters='):
            return unquote(variable[20:])
        return variable
    
    register = template.Library()
    register.filter('decode_filter', decode_filter)
    
        8
  •  0
  •   Abdul Gaffar    8 年前

    使用客户端解决方案将是合适的解决方案。

    <a href="javascript:history.go(-1)" class="btn btn-default">Cancel</a>
    
        9
  •  0
  •   Markus    4 年前

    request.META.HTTP_REFERER

    我通常在创建或更改对象的窗体下有一个取消按钮。如果用户提交表单一次,而服务器端验证失败,则会再次向用户显示表单,其中包含错误的数据。你猜怎么着, 现在指向显示表单的URL。您可以按“取消”一千次,并且永远不会返回到初始编辑/创建链接所在的位置。

    我能想到的唯一固溶体是有点复杂,但对我有效。如果有人知道一个更简单的解决方案,我很乐意听到。:-)

    我为完成大部分工作的表单创建了一个mixin类:

    from django import forms
    from django.utils.http import url_has_allowed_host_and_scheme
    
    class FormCancelLinkMixin(forms.Form):
        """ Mixin class that provides a proper Cancel button link. """
        cancel_link = forms.fields.CharField(widget=forms.HiddenInput())
    
        def __init__(self, *args, **kwargs):
            """
            Override to pop 'request' from kwargs.
            """
            self.request = kwargs.pop("request")
            initial = kwargs.pop("initial", {})
            # set initial value of 'cancel_link' to the referer
            initial["cancel_link"] = self.request.META.get("HTTP_REFERER", "")
            kwargs["initial"] = initial
            super().__init__(*args, **kwargs)
    
        def get_cancel_link(self):
            """
            Return correct URL for cancelling the form.
    
            If the form has been submitted, the HTTP_REFERER in request.meta points to
            the view that handles the form, not the view the user initially came from.
            In this case, we use the value of the 'cancel_link' field.
    
            Returns:
                A safe URL to go back to, should the user cancel the form.
    
            """
            if self.is_bound:
                url = self.cleaned_data["cancel_link"]
                # prevent open redirects
                if url_has_allowed_host_and_scheme(url, self.request.get_host()):
                    return url
    
            # fallback to current referer, then root URL
            return self.request.META.get("HTTP_REFERER", "/")
    

    class SomeModelForm(FormCancelLinkMixin, forms.ModelForm):
        """ Form for creating some model instance. """
    
        class Meta:
            model = ModelClass
        # ...
    

    视图必须将当前请求传递给表单。对于基于类的视图,可以替代 get_form_kwargs() :

    class SomeModelCreateView(CreateView):
        model = SomeModelClass
        form_class = SomeModelForm
    
        def get_form_kwargs(self):
            kwargs = super().get_form_kwargs()
            kwargs["request"] = self.request
            return kwargs
    

    在显示表单的模板中:

    <form method="post">
      {% csrf token %}
      {{ form }}
      <input type="submit" value="Save">
      <a href="{{ form.get_cancel_link }}">Cancel</a>
    </form>