如何处理不同页面上的相同表单(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')),
希望对您有所帮助。
祝你好运!
我有一个名为 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')),
希望对您有所帮助。
祝你好运!