如何处理不同页面上的相同表单(DRY)

how to handle same form on different pages (DRY)

我有一个名为 base.html 的模板。它在其顶部包含一个固定的搜索表单。我的所有其他模板都继承自 base.html。我想让我的表单在每个页面上都有效(现在我有 10 个不同的页面)。

一个愚蠢的解决方案是为每个单独的视图处理表单,但这与 DRY 相反。

那么我如何才能一次处理所有视图的表单?

注意:base.html 只是一个模板,不直接被视图使用。

您需要为 'search' 创建一个单独的应用程序,并且需要相应地创建视图和模板。

我的 Django 项目中有一个名为 'Products' 的应用程序,它有一个名为 'Product' 的模型,我使用搜索从该模型进行搜索。

search/views.py:

from django.shortcuts import render
from django.views.generic import ListView
from products.models import Product

class SearchProductView(ListView):
    template_name = "search/view.html"

    def get_context_data(self, *args, **kwargs):
        context = super(SearchProductView, self).get_context_data(*args, **kwargs)
        query = self.request.GET.get('q')
        context['query'] = query
        # SearchQuery.objects.create(query=query)
        return context

    def get_queryset(self, *args, **kwargs):
        request = self.request
        method_dict = request.GET
        query = method_dict.get('q', None) # method_dict['q']
        if query is not None:
            return Product.objects.search(query)
        return Product.objects.featured()
        '''
        __icontains = field contains this
        __iexact = fields is exactly this
        '''

search/templates/view.html(呈现搜索结果):

{% extends "base.html" %}

{% block content %}
 <div class='row  mb-3'>
            {% if query %}
            <div class='col-12' >
                Results for <b>{{ query }}</b>
                <hr/>
            </div>
            {% else %}

            <div class='col-12 col-md-6 mx-auto py-5'>
               {% include 'search/snippets/search-form.html' %}

            </div>
            <div class='col-12'>
                <hr>
            </div>
            {% endif %}
</div>


        <div class='row'>



    {% for obj in object_list %}
        <div class='col'>

        {% include 'products/snippets/card.html' with instance=obj %}  

        {% if forloop.counter|divisibleby:3 %}
         </div> </div><div class='row'><div class='col-12'><hr/></div>
        {% elif forloop.counter|divisibleby:2 %}
            </div> </div><div class='row'><div class='col-12'><hr/></div>
        {% else %}
         </div>  
        {% endif %}


    {% endfor %}
</div>
{% endblock %}

search/templates/snippets/search-form.html:

<form method='GET' action='{% url "search:query" %}' class="form my-2 my-lg-0 search-form">
  <div class='input-group'>
    <input class="form-control" type="text" placeholder="Search" name='q' aria-label="Search" value='{{ request.GET.q }}'>
    <span class='input-group-btn'>
        <button class="btn btn-outline-success" type="submit">Search</button>
    </span>
    </div>
</form>

最后,urls.py 搜索应用:

from django.conf.urls import url

from .views import (
        SearchProductView
        )

urlpatterns = [
    url(r'^$', SearchProductView.as_view(), name='query'),
]

并将其包含在您的主要 urls.py:

url(r'^search/', include("search.urls", namespace='search')),

希望对您有所帮助。

祝你好运!