【问题标题】:Django - Have a class based view and Crispy form parrallell to each other on same pageDjango - 在同一页面上有一个基于类的视图和 Crispy 表单相互平行
【发布时间】:2014-01-11 05:10:49
【问题描述】:

使用 Django,我正在制作一个显示门票的网站。在登录页面上,我希望它位于登录表单左侧现有票证的预览区域的位置。我可以分别制作两个页面,但我不知道如何使它们并存。我也在使用 jinja2 模板。我已经尝试了 2 天,并且一遍又一遍地阅读教程。这是我的方法:

url.py:

urlpatterns = patterns('',
   url(r'', include('ticket_app.urls')),
   url(r'^accounts/login/$', login, {'authentication_form': forms.LoginForm}, name='login'),
)

views.py 注意:request是数据库表对象:

class PreviewList(ListView):
    model = Request

form.py:

class LoginForm(AuthenticationForm):
def __init__(self, *args, **kwargs):
    super(LoginForm, self).__init__(*args, **kwargs)
    self.helper = FormHelper()
    self.helper.form_class = 'form-horizontal'
    self.helper.label_class = 'col-lg-2'
    self.helper.field_class = 'col-lg-8'
    self.helper.form_tag = False
    self.helper.layout = Layout(
        Field('username', placeholder="Username", css_class='input-xlarge'),
        Field('password', placeholder="Password", css_class='input-xlarge'),
        FormActions(
            Submit('login', 'Login', css_class="btn-primary"),
        )

base.html(短版):

<h1>{% block page_title %}Preview of tickets{% endblock page_title %}</h1>
{%  block preview %}
{%  endblock preview %}

{%  block login %}
{%  endblock login %}

preview.html:

{% extends 'base.html'%}
{% block preview %}
    <div class="span6">
    <ul class="list-group">
    {% if object_list %}
    {% for item in  object_list  %}
    <li class="list-group-item">{{item.date_due}} - {{item.desctription}}
    <span  class="badge">
        {% if item.user_assigned %}
        <span class="badge"style="color:green">  assigned  </span>
        {% else %}<span class="badge" style="color:red">unassigned</span>
        {% endif %}
        </li>
    {% endfor %}
    {% else %}
        <p>Yay! No ticket requests found!</p>
    {% endif %}
</div>

{% endblock preview %}

login.html:

{% extends 'base.html' %}
{% load crispy_forms_tags %}

{% block login %}
    <div class="container" style="padding-bottom: 70px;">
        <div class='row'>
            <div class='col-md-6 col-md-offset-3'>
                <div class="well">
                    <legend>Sign in to Site</legend>
                    <form method="post" action="{% url 'django.contrib.auth.views.login' %}" class="form-horizontal">
                        {% crispy form %}
                        <input type="hidden" name="next" value="{{ next }}"/>
                    </form>
                </div>
            </div>
        </div>
    </div>

{% endblock login %}

【问题讨论】:

    标签: python html django


    【解决方案1】:

    有多种方法可以做到这一点。例如,您可以创建自己的登录视图,“扩展”来自django.contrib.auth 的登录视图:

    from django.contrib.auth.views import login
    
    def login_with_preview(request, extra_context=None, *args, **kwargs):
        if extra_context is None:
            extra_context = {}
        extra_context['object_list'] = Request.objects.all()
        return login(request, authentication_form=LoginForm, extra_context=extra_context, *args, **kwargs)
    

    然后在你的 url conf 中使用 login_with_preview 并合并你的两个模板。

    另一种可能性是创建custom template tag。如果您想在不同的地方显示此预览列表,这尤其好:

    @register.inclusion_tag("yourapp/preview_list.html")
    def ticket_preview_list():
        return {'object_list': Request.objects.all()}
    

    preview_list.html 应该包含模板代码,现在,它位于您的preview 模板块中。您需要确保该模板不扩展 base.html;那会搞砸的。通常的template tag setup steps 申请。

    【讨论】:

      【解决方案2】:

      您可以创建一个呈现登录表单和预览数据的视图

      【讨论】:

      • 这必须没有 Crispy Forms 吗?我在使用 Crispy Forms 似乎需要的 init 方面没有取得任何成功。
      猜你喜欢
      • 2016-03-22
      • 2012-08-07
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 2015-12-26
      • 2013-02-07
      相关资源
      最近更新 更多