Pergunta

I wrote a simple app that is a custom DateField widget for mezzanine. Afaik it's, it's a simple case and besides overextending a template it would be the same in pure django or django-cms (feel free to correct me if I'm wrong). The widget:

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",)

I overextend base.html template to insert form.media:

{% overextends "base.html" %}

{% load pages_tags mezzanine_tags i18n future staticfiles %}

{% block extra_head %}{{ block.super }}
{{ form.media }}
{% endblock %}

Now, I create a form for my model class. Here's the class:

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))

Here's the model form:

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)

Here's the view:

@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)

Here's the template:

{% 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 %}

Now if I view the form in a browser, the custom widget is there (I can tell because the input html tag has my custom class attribute value) but it doesn't inject the form media, it's missing. Any idea what's going on here? Thanks in advance! Cheers :-)

Foi útil?

Solução

form isn't available in the template, because you've called your form variable pform.

Try {{ pform.media }}.

Outras dicas

I was googled here with the same problem under different conditions and spotted another error that may appear under other conditions (my case is extending change_form.html in Django 2.1): I had to use extrahead instead of extra_head

{% block extrahead %}{{ block.super }}
{{ form.media }}
{% endblock %}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top