Django 改变<;输入>;CreateView和UpdateView中使用的窗体的类型和属性

Django 改变<;输入>;CreateView和UpdateView中使用的窗体的类型和属性,django,django-crispy-forms,Django,Django Crispy Forms,我正在试用Django 1.4.6项目来跟踪销售线索。我希望这是移动友好,所以我使用Twitter引导(仍然在版本2.3.2)与。根据,创建电子邮件字段的最佳方法是,而创建日期字段的最佳方法是。默认情况下,这些属性都不是用Django实现的,我想知道如何最好地实现它们。以下是相关代码(简化): 型号.py from django.db import models class Lead(models.Model): name = models.CharField(max_length=

我正在试用Django 1.4.6项目来跟踪销售线索。我希望这是移动友好,所以我使用Twitter引导(仍然在版本2.3.2)与。根据,创建电子邮件字段的最佳方法是
,而创建日期字段的最佳方法是
。默认情况下,这些属性都不是用Django实现的,我想知道如何最好地实现它们。以下是相关代码(简化):

型号.py

from django.db import models


class Lead(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField(blank=True, null=True)
    initial_contact_date = models.DateField()

    class Meta:
        ordering = ('name',)

    def __unicode__(self):
        return self.name
from django.core.urlresolvers import reverse
from django.views.generic import CreateView, ListView, UpdateView
from .models import Lead


class LeadAdd(CreateView):
    model = Lead

    def get_context_data(self, **kwargs):
        context = super(LeadAdd, self).get_context_data(**kwargs)
        context['title'] = 'Add a Lead'
        return context

    def get_success_url(self):
        return reverse('lead_list')


class LeadEdit(LeadAdd, UpdateView):
    def get_context_data(self, **kwargs):
        context = super(LeadEdit, self).get_context_data(**kwargs)
        context['title'] = 'Edit a Lead'
        return context


class LeadList(ListView):
    model = Lead
from django.conf.urls import patterns, url
from .views import *


urlpatterns = patterns('',
    url(r'^$', view=LeadList.as_view(), name='lead_list'),
    url(r'^add/$', view=LeadAdd.as_view(), name='lead_add'),
    url(r'^edit/(?P<pk>[\d]+)/$', view=LeadEdit.as_view(), name='lead_edit'),
)
视图.py

from django.db import models


class Lead(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField(blank=True, null=True)
    initial_contact_date = models.DateField()

    class Meta:
        ordering = ('name',)

    def __unicode__(self):
        return self.name
from django.core.urlresolvers import reverse
from django.views.generic import CreateView, ListView, UpdateView
from .models import Lead


class LeadAdd(CreateView):
    model = Lead

    def get_context_data(self, **kwargs):
        context = super(LeadAdd, self).get_context_data(**kwargs)
        context['title'] = 'Add a Lead'
        return context

    def get_success_url(self):
        return reverse('lead_list')


class LeadEdit(LeadAdd, UpdateView):
    def get_context_data(self, **kwargs):
        context = super(LeadEdit, self).get_context_data(**kwargs)
        context['title'] = 'Edit a Lead'
        return context


class LeadList(ListView):
    model = Lead
from django.conf.urls import patterns, url
from .views import *


urlpatterns = patterns('',
    url(r'^$', view=LeadList.as_view(), name='lead_list'),
    url(r'^add/$', view=LeadAdd.as_view(), name='lead_add'),
    url(r'^edit/(?P<pk>[\d]+)/$', view=LeadEdit.as_view(), name='lead_edit'),
)
url.py

from django.db import models


class Lead(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField(blank=True, null=True)
    initial_contact_date = models.DateField()

    class Meta:
        ordering = ('name',)

    def __unicode__(self):
        return self.name
from django.core.urlresolvers import reverse
from django.views.generic import CreateView, ListView, UpdateView
from .models import Lead


class LeadAdd(CreateView):
    model = Lead

    def get_context_data(self, **kwargs):
        context = super(LeadAdd, self).get_context_data(**kwargs)
        context['title'] = 'Add a Lead'
        return context

    def get_success_url(self):
        return reverse('lead_list')


class LeadEdit(LeadAdd, UpdateView):
    def get_context_data(self, **kwargs):
        context = super(LeadEdit, self).get_context_data(**kwargs)
        context['title'] = 'Edit a Lead'
        return context


class LeadList(ListView):
    model = Lead
from django.conf.urls import patterns, url
from .views import *


urlpatterns = patterns('',
    url(r'^$', view=LeadList.as_view(), name='lead_list'),
    url(r'^add/$', view=LeadAdd.as_view(), name='lead_add'),
    url(r'^edit/(?P<pk>[\d]+)/$', view=LeadEdit.as_view(), name='lead_edit'),
)
来自django.conf.url导入模式,url
从。视图导入*
urlpatterns=模式(“”,
url(r'^$',view=LeadList.as_view(),name='lead_list'),
url(r'^add/$,view=leadd.as_view(),name='lead_add'),
url(r'^edit/(?P[\d]+)/$,view=LeadEdit.as_view(),name='lead_edit'),
)
lead\u form.html

{% extends 'base.html' %}

{% load crispy_forms_tags %}

{% block content %}
    <div class="page-header">
        <h1>{{ title }}</h1>
    </div>

    <form action="." method="post" class="form-horizontal">
        {% csrf_token %}

        {{ form|crispy}}

        <div class="form-actions">
            <button type="submit" class="btn btn-primary">Submit</button>
        </div>
    </form>
{% endblock content %}
{%extends'base.html%}
{%load crispy_forms_tags%}
{%block content%}
{{title}}
{%csrf_令牌%}
{{form | crispy}}
提交
{%endblock内容%}

使用字段模板执行此操作():

或者创建一个自定义小部件。您可以使用一个预定义的窗口小部件,但其中一个现有的预定义窗口小部件应该可以工作:

# widgets.py
from django.forms.widgets import TextInput

class EmailInput(TextInput):
    input_type = 'email'
所以在你看来可能是这样的:

class LeadAdd(CreateView):
    model = Lead
    form_class = LeadAddForm
    ...
然后,LeadAddForm类将定义您的自定义小部件:

from . import widgets

LeadAddForm(forms.Form):
    email = forms.CharField(
        ...
        widget = widgets.EmailInput,
        ...
    )
或者您可以在初始化中设置小部件:

class LeadAddForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(LeadAddForm, self).__init__(*args, **kwargs)

        self.fields['email'].widget = widgets.EmailInput()
您应该能够使用crispy表单配置设置额外属性(autocapitalize=“off”autocorrect=“off”):

Field('email', autocapitalize="off", autocorrect="off")
更简单的选择是:

forms.py

class LeadForm(forms.ModelForm):
    class Meta:
        model = Lead

    def __init__(self, *args, **kwargs):
        super(LeadForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_class = 'form-horizontal'
        self.helper.layout = Layout(
             Fieldset('Enter the following information',
                      'name',
                      Field('email', type="email",
                                     autocapitalize="off",
                                     autocorrect="off"),
                      Field('initial_contact_date', type="date")),
             FormActions(
                Submit('save', 'Create Lead'),
                Button('cancel', 'Cancel')
            )
        )
class LeadAdd(CreateView):
    model = Lead
    success_url = reverse('lead_list')
    form_class = LeadForm

    def get_context_data(self, **kwargs):
        context = super(LeadAdd, self).get_context_data(**kwargs)
        context['title'] = 'Add a Lead'
        return context

class LeadEdit(LeadAdd, UpdateView):
    def get_context_data(self, **kwargs):
        context = super(LeadEdit, self).get_context_data(**kwargs)
        context['title'] = 'Edit a Lead'
        return context
在您的
视图.py
中:

class LeadForm(forms.ModelForm):
    class Meta:
        model = Lead

    def __init__(self, *args, **kwargs):
        super(LeadForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_class = 'form-horizontal'
        self.helper.layout = Layout(
             Fieldset('Enter the following information',
                      'name',
                      Field('email', type="email",
                                     autocapitalize="off",
                                     autocorrect="off"),
                      Field('initial_contact_date', type="date")),
             FormActions(
                Submit('save', 'Create Lead'),
                Button('cancel', 'Cancel')
            )
        )
class LeadAdd(CreateView):
    model = Lead
    success_url = reverse('lead_list')
    form_class = LeadForm

    def get_context_data(self, **kwargs):
        context = super(LeadAdd, self).get_context_data(**kwargs)
        context['title'] = 'Add a Lead'
        return context

class LeadEdit(LeadAdd, UpdateView):
    def get_context_data(self, **kwargs):
        context = super(LeadEdit, self).get_context_data(**kwargs)
        context['title'] = 'Edit a Lead'
        return context
在模板中:

{% extends 'base.html' %}

{% load crispy_forms_tags %}

{% block content %}
    <div class="page-header">
        <h1>{{ title }}</h1>
    </div>

        {% crispy form %}

{% endblock content %}
{%extends'base.html%}
{%load crispy_forms_tags%}
{%block content%}
{{title}}
{%crispy form%}
{%endblock内容%}