simple only noweekends language jquery django jquery-ui django-models django-forms

noweekends - jquery ui only datepicker



Cómo usar un JQuery Datepicker con el lenguaje de plantilla de Django (3)

Miré este enlace y encontré algo de ayuda, pero me pregunto cómo puedo elegir usar un widget JQueryUI Datepicker para un DateField que tengo en mi models.py

models.py

from django.db import models class EModel(models.Model): date = models.DateField(blank=False)

forms.py

from django import forms from models import EModel class EForm(forms.ModelForm): class Meta: model = EModel

form.html - Cómo hace Django mi formulario. No en la página de administración

<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Form</title> <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" /> <script src="http://code.jquery.com/jquery-1.9.1.js"></script> <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script> <link rel="stylesheet" href="/resources/demos/style.css" /> </head> <body> <form action="" method="post">{% csrf_token %} {{ form.date }} <!-- ***** --> <!-- The rest of my form --> </form> </body>

Estoy esperando una forma de hacer que mi campo de modelo de ''fecha'' se represente como un widget JQueryUI Datepicker, pero busqué y no encontré la forma de vincular los dos (en mi caso).

SOLUCIÓN

En mi forms.py

from django import forms from models import EModel class EForm(forms.ModelForm): class Meta: model = EModel widgets = { ''date'' : forms.DateInput(attrs={''type'':''date''}) }


Lo mejor es crear un nuevo widget en un archivo widgets.py en su aplicación:

Aquí hay un ejemplo mío para un selector de color:

- widgets.py -

from django import forms from django.conf import settings from django.utils.safestring import mark_safe class ColorPickerWidget(forms.TextInput): class Media: css = { ''all'': ( settings.STATIC_URL + ''colorpicker/css/colorpicker.css'', ) } js = ( settings.STATIC_URL + ''js/jquery-1.8.3.min.js'', settings.STATIC_URL + ''colorpicker/js/colorpicker.js'', ) def __init__(self, language=None, attrs=None): self.language = language or settings.LANGUAGE_CODE[:2] super(ColorPickerWidget, self).__init__(attrs=attrs) def render(self, name, value, attrs=None): rendered = super(ColorPickerWidget, self).render(name, value, attrs) return rendered + mark_safe(u'''''' <script type="text/javascript"> jQuery(''#id_%s'').css("background-color", "#"+jQuery(''#id_%s'').val()); jQuery(''#id_%s'').ColorPicker({ onSubmit: function(hsb, hex, rgb, el) { jQuery(el).val(hex); jQuery(el).css("background-color", "#"+hex); jQuery(el).ColorPickerHide(); }, onBeforeShow: function () { code = this.value if (code.length==3) code = code.charAt(0)+code.charAt(0)+code.charAt(1)+code.charAt(1)+code.charAt(2)+code.charAt(2); jQuery(this).ColorPickerSetColor(code); } }).bind(''keyup'', function(){ el = jQuery(this); code = el.val(); hex = ''#''+code; var isOk = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(hex); if (isOk) { el.css("background-color", hex); if (code.length==3) code = code.charAt(0)+code.charAt(0)+code.charAt(1)+code.charAt(1)+code.charAt(2)+code.charAt(2); el.ColorPickerSetColor(code); } else if (code=="") el.css("background-color", ""); }); </script> '''''' % (name, name, name))

--- views.py ---

from django import forms ColorPickerWidget from myapp.widgets import class EditBackgroundForm(forms.Form): background = forms.CharField(max_length=10, widget= ColorPickerWidget(), required = False, label="Background color")

Además, también puede crear un campo de formulario personalizado con su widget y sobre su método clean() .


Edite los atributos de widgets de fecha en el formulario de modelo, dándoles la clase ''.datepicker'', ya que eso es lo que buscará el fechador de JQuery. Entonces su ModelForm se convierte en:

class EForm(forms.ModelForm): class Meta: model = EModel widgets = {''date'': DateInput(attrs={''class'': ''datepicker''})}

Documentación aquí .


Uso el siguiente código y funciona bien para mí. He mencionado todos los archivos para este proyecto,

models.py

from django.db import models class EModel(models.Model): date = models.DateField(blank=False)

forms.py

from django import forms from testApp.models import EModel class EForm(forms.ModelForm): class Meta: model = EModel widgets = {''date'': forms.DateInput(attrs={''class'': ''datepicker''})}

form.html

<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Form</title> <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" /> <script src="http://code.jquery.com/jquery-1.9.1.js"></script> <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script> <link rel="stylesheet" href="/resources/demos/style.css" /> <script> $(function() { $( "#id_date" ).datepicker(); }); </script> </head> <body> <form action="/datepickerview/" method="post">{% csrf_token %} <!--{{ form.date }} --> <p>Date: <input name=''date'' type="text" id="id_date"></p> <!-- The rest of my form --> <input type="submit" value="login" /> </form> </body>

views.py

from django.shortcuts import render from django.http import HttpResponse from django.template import Context from django.shortcuts import render_to_response from django.http import HttpResponseRedirect from django.core.context_processors import csrf from django.template import RequestContext from forms import EForm def datepickerview(request): # Get the context from the request. context = RequestContext(request) # A HTTP POST? if request.method == ''POST'': form = EForm(request.POST) # Have we been provided with a valid form? if form.is_valid(): form.save(commit=True) return HttpResponse("Successfully added the date to database"); else: # The supplied form contained errors - just print them to the terminal. print form.errors else: # If the request was not a POST, display the form to enter details. form = EForm() return render_to_response(''form.html'', {''form'': form}, context)

urls.py

from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('''', url(r''^datepickerview/$'', ''testApp.views.datepickerview''), )

admin.py

from django.contrib import admin from testApp.models import EModel admin.site.register(EModel)