我写了一个简单的应用程序,它是夹层的自定义DateField小部件。 Afaik它是,这是一个简单的案例,除了过度扩展模板,它将在纯django或django-cms中相同(如果我错了,请随时纠正我)。 小部件:
class DatePickerInput(forms.DateInput):
def __init__(self, attrs = None, format = None):
super(DatePickerInput, self).__init__(attrs, format)
self.attrs["class"] = "datepicker"
class Media:
css = { "all": ('css/ui-lightness/jquery-ui-1.10.3.custom.min.css',) }
js = (
"mezzanine/js/" + getattr(settings, "JQUERY_UI_FILENAME", "jquery-ui-1.9.1.custom.min.js"),
"js/datepicker_setup.js",)
我过度扩展base.html模板以插入form.media:
{% overextends "base.html" %}
{% load pages_tags mezzanine_tags i18n future staticfiles %}
{% block extra_head %}{{ block.super }}
{{ form.media }}
{% endblock %}
现在,我为我的模型类创建一个表单。 这是班级:
class PlayerProfile(models.Model):
user = models.OneToOneField("auth.User")
# Can be later changed to use a setting variable instead of a fixed date
date_of_birth = models.DateField(default=date(1990, 1, 1))
这是模型形式:
from DateWidgets.widgets import DatePickerInput
from PlayerProfiles.models import PlayerProfile
class EditPlayerProfileForm(Html5Mixin, forms.ModelForm):
class Meta:
model = PlayerProfile
fields = ("date_of_birth", )
widgets = { 'date_of_birth': DatePickerInput }
def __init__(self, *args, **kwargs):
super(EditPlayerProfileForm, self).__init__(*args, **kwargs)
以下是观点:
@login_required
def profile_update(request, template="accounts/account_profile_update.html"):
"""
Profile update form.
"""
pform = forms.EditPlayerProfileForm
player_form = pform(request.POST or None, request.FILES or None, instance=request.user.playerprofile)
context = {"pform": player_form, "title": _("Update Profile"), "profile_user": request.user}
return render(request, template, context)
这是模板:
{% overextends "accounts/account_profile_update.html" %}
{% load i18n mezzanine_tags %}
{% block main %}
<fieldset>
<legend>{{ title }}</legend>
<form method="post"{% if pform.is_multipart %} enctype="multipart/form-data"{% endif %}>
{% fields_for pform %}
<div class="form-actions">
<input class="btn btn-primary btn-large" type="submit" value="{{ title }}">
</div>
</form>
</fieldset>
{% endblock %}
现在,如果我在浏览器中查看表单,那么自定义小部件就在那里(我可以告诉因为输入的html标签有我的自定义类属性值)但是它没有注入表单媒体,它已经丢失了。知道这里发生了什么吗?提前致谢!干杯: - )
答案 0 :(得分:3)
form
在模板中不可用,因为您调用了表单变量pform
。
尝试{{ pform.media }}
。
答案 1 :(得分:0)
我在不同条件下被谷歌搜索到,并发现了在其他条件下可能出现的另一个错误(我的案例在Django 2.1中扩展了change_form.html
):我不得不使用extrahead
而不是extra_head
{% block extrahead %}{{ block.super }}
{{ form.media }}
{% endblock %}