Χρησιμοποιώντας Django ώρα / ημερομηνία widgets στην προσαρμοσμένη μορφή

ψήφοι
158

Πώς μπορώ να χρησιμοποιήσω τις μόδας ημερομηνία και ώρα widgets JavaScript που χρησιμοποιεί το προεπιλεγμένο διαχειριστή με το έθιμο την άποψή μου;

Έχω κοίταξε μέσα από το μορφές τεκμηρίωσης Django , και αναφέρει εν συντομία django.contrib.admin.widgets, αλλά δεν ξέρω πώς να το χρησιμοποιήσει;

Εδώ είναι το πρότυπο μου ότι θέλω να εφαρμόζεται.

<form action=. method=POST>
    <table>
        {% for f in form %}
           <tr> <td> ` f`.`name `</td> <td>` f `</td> </tr>
        {% endfor %}
    </table>
    <input type=submit name=submit value=Add Product>
</form>

Επίσης, πιστεύω ότι θα πρέπει να σημειωθεί ότι δεν έχω γράψει πραγματικά μια θέα τον εαυτό μου γι 'αυτό το έντυπο, είμαι χρησιμοποιώντας μια γενική άποψη. Εδώ είναι η είσοδος από την url.py:

(r'^admin/products/add/$', create_object, {'model': Product, 'post_save_redirect': ''}),

Και είμαι απαιτούμενα νέος στο όλο θέμα Django / MVC / MTV, οπότε μπορείτε να πάτε εύκολα ...

Δημοσιεύθηκε 02/09/2008 στις 00:22
πηγή χρήστη
Σε άλλες γλώσσες...                            


16 απαντήσεις

ψήφοι
149

Η αυξανόμενη πολυπλοκότητα αυτής της απάντησης πάροδο του χρόνου, και οι πολλές αμυχές που απαιτούνται, κατά πάσα πιθανότητα θα πρέπει να σας προειδοποιήσουμε κατά τον τρόπο αυτό καθόλου. Είναι στηριζόμενη σε παράνομους εσωτερικές λεπτομέρειες εφαρμογής του διαχειριστή, είναι πιθανό να σπάσει και πάλι σε μελλοντικές εκδόσεις του Django, και δεν είναι εύκολο να εφαρμοστεί μόνο τη διαπίστωση άλλο ημερολόγιο widget JS και χρησιμοποιώντας αυτό.

Τούτου λεχθέντος, εδώ είναι ό, τι πρέπει να κάνετε αν είστε αποφασισμένοι να κάνουν αυτό το έργο:

  1. Ορίστε τα δικά σας υποκατηγορία ModelForm για το μοντέλο σας (καλύτερα να το βάλετε στο forms.py στην εφαρμογή σας), και να πει ότι για να χρησιμοποιήσετε το AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (αντικαταστήστε το «mydate» κλπ με τα κατάλληλα ονόματα τομέα από το μοντέλο σας):

    from django import forms
    from my_app.models import Product
    from django.contrib.admin import widgets                                       
    
    class ProductForm(forms.ModelForm):
        class Meta:
            model = Product
        def __init__(self, *args, **kwargs):
            super(ProductForm, self).__init__(*args, **kwargs)
            self.fields['mydate'].widget = widgets.AdminDateWidget()
            self.fields['mytime'].widget = widgets.AdminTimeWidget()
            self.fields['mydatetime'].widget = widgets.AdminSplitDateTime()
    
  2. Αλλάξτε URLconf σας για να περάσει «form_class»: ProductForm αντί του «μοντέλου»: το προϊόν με την γενική άποψη create_object (που θα σήμαινε «από my_app.forms εισαγωγή ProductForm» αντί για «από my_app.models εισαγωγή προϊόντων», φυσικά).

  3. Στο κεφάλι του προτύπου σας, να περιλαμβάνει `` form`.`media για την έξοδο των συνδέσεων με τα αρχεία Javascript.

  4. Και το Hacky μέρος: οι διαχειριστή ημερομηνία / ώρα widgets θεωρούν ότι η i18n JS ουσία έχει φορτωθεί, αλλά και απαιτούν core.js, αλλά δεν παρέχουν ούτε ένα αυτόματα. Έτσι, το πρότυπο πάνω `` form`.`media που θα χρειαστείτε:

    <script type="text/javascript" src="/my_admin/jsi18n/"></script>
    <script type="text/javascript" src="/media/admin/js/core.js"></script>
    

    Μπορεί επίσης να θέλετε να χρησιμοποιήσετε την ακόλουθη διαχειριστή CSS (χάρη Alex για παραπέμπουν σε αυτό):

    <link rel="stylesheet" type="text/css" href="/media/admin/css/forms.css"/>
    <link rel="stylesheet" type="text/css" href="/media/admin/css/base.css"/>
    <link rel="stylesheet" type="text/css" href="/media/admin/css/global.css"/>
    <link rel="stylesheet" type="text/css" href="/media/admin/css/widgets.css"/>
    

Αυτό σημαίνει ότι το admin μέσα ενημέρωσης Django του (ADMIN_MEDIA_PREFIX) βρίσκεται στο / media / admin / - μπορείτε να αλλάξετε ότι για την εγκατάσταση σας. Στην ιδανική περίπτωση που θέλετε να χρησιμοποιήσετε έναν επεξεργαστή πλαίσιο για να περάσει αυτό το αξιών στο πρότυπό σας, αντί να ενσωματώνουμε αυτό, αλλά αυτό είναι πέρα ​​από το πεδίο αυτού του ζητήματος.

Αυτό απαιτεί, επίσης, ότι η διεύθυνση URL / my_admin / jsi18n / να συνδεθούν με το χέρι μέχρι το django.views.i18n.javascript_catalog προβολή (ή null_javascript_catalog αν δεν χρησιμοποιείτε I18N). Θα πρέπει να το κάνετε αυτό στον εαυτό σας, αντί να πάει μέσω της εφαρμογής διαχειριστή ώστε να είναι προσβάσιμη, ανεξάρτητα από το αν είστε συνδεδεμένοι στο διαχειριστή (χάρη Jeremy που το επεσήμανε). Δείγμα κώδικα για URLconf σας:

(r'^my_admin/jsi18n', 'django.views.i18n.javascript_catalog'),

Τέλος, αν χρησιμοποιείτε Django 1.2 ή νεότερη έκδοση, θα πρέπει να έχετε κάποια επιπλέον κώδικα στο πρότυπό σας για να βοηθήσει τα widgets βρείτε τους μέσα ενημέρωσης:

{% load adminmedia %} /* At the top of the template. */

/* In the head section of the template. */
<script type="text/javascript">
window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";
</script>

Ευχαριστώ lupefiasco για την προσθήκη αυτή.

Απαντήθηκε 02/09/2008 στις 07:10
πηγή χρήστη

ψήφοι
62

Δεδομένου ότι η λύση είναι hackish, νομίζω ότι χρησιμοποιώντας τη δική σας ημερομηνία / ώρα widget με μερικά JavaScript είναι πιο εφικτή.

Απαντήθηκε 16/09/2008 στις 14:39
πηγή χρήστη

ψήφοι
12

Ναι, κατέληξα να επιτακτικό το / admin / jsi18n / url.

Εδώ είναι αυτό που προστίθεται στο urls.py. μου Βεβαιωθείτε ότι είναι πάνω από το / admin / url

    (r'^admin/jsi18n', i18n_javascript),

Και εδώ είναι το i18n_javascript λειτουργία δημιούργησα.

from django.contrib import admin
def i18n_javascript(request):
  return admin.site.i18n_javascript(request)
Απαντήθηκε 02/01/2009 στις 23:53
πηγή χρήστη

ψήφοι
7

Συμπληρώνοντας την απάντηση από τον Carl Meyer, θα ήθελα να σχολιάσω ότι θα πρέπει να τεθεί η επικεφαλίδα σε κάποια έγκυρη μπλοκ (μέσα στο header) μέσα σε πρότυπο.

{% block extra_head %}

<link rel="stylesheet" type="text/css" href="/media/admin/css/forms.css"/>
<link rel="stylesheet" type="text/css" href="/media/admin/css/base.css"/>
<link rel="stylesheet" type="text/css" href="/media/admin/css/global.css"/>
<link rel="stylesheet" type="text/css" href="/media/admin/css/widgets.css"/>

<script type="text/javascript" src="/admin/jsi18n/"></script>
<script type="text/javascript" src="/media/admin/js/core.js"></script>
<script type="text/javascript" src="/media/admin/js/admin/RelatedObjectLookups.js"></script>

` form`.`media `

{% endblock %}
Απαντήθηκε 05/04/2009 στις 21:02
πηγή χρήστη

ψήφοι
10

Θεωρώ τον εαυτό μου αναφορά σε αυτό το post πολύ, και διαπίστωσε ότι η τεκμηρίωση ορίζει ένα ελαφρώς μικρότερο hacky τρόπο να παρακάμψουν την προεπιλεγμένη widgets.

( Δεν χρειάζεται να παρακάμψετε τη μέθοδο __init__ του ModelForm του )

Ωστόσο, θα πρέπει ακόμα να συνδέσετε JS και CSS σας κατάλληλα, όπως αναφέρει ο Carl.

forms.py

from django import forms
from my_app.models import Product
from django.contrib.admin import widgets                                       


class ProductForm(forms.ModelForm):
    mydate = forms.DateField(widget=widgets.AdminDateWidget)
    mytime = forms.TimeField(widget=widgets.AdminTimeWidget)
    mydatetime = forms.SplitDateTimeField(widget=widgets.AdminSplitDateTime)

    class Meta:
        model = Product

Αναφορά Τύποι πεδίο για να βρείτε τα πεδία προεπιλεγμένη φόρμα.

Απαντήθηκε 08/09/2009 στις 07:42
πηγή χρήστη

ψήφοι
1

Ενημερώθηκε λύση και η λύση για SplitDateTime με απαιτούμενη = False :

forms.py

from django import forms

class SplitDateTimeJSField(forms.SplitDateTimeField):
    def __init__(self, *args, **kwargs):
        super(SplitDateTimeJSField, self).__init__(*args, **kwargs)
        self.widget.widgets[0].attrs = {'class': 'vDateField'}
        self.widget.widgets[1].attrs = {'class': 'vTimeField'}  


class AnyFormOrModelForm(forms.Form):
    date = forms.DateField(widget=forms.TextInput(attrs={'class':'vDateField'}))
    time = forms.TimeField(widget=forms.TextInput(attrs={'class':'vTimeField'}))
    timestamp = SplitDateTimeJSField(required=False,)

Form.html

<script type="text/javascript" src="/admin/jsi18n/"></script>
<script type="text/javascript" src="/admin_media/js/core.js"></script>
<script type="text/javascript" src="/admin_media/js/calendar.js"></script>
<script type="text/javascript" src="/admin_media/js/admin/DateTimeShortcuts.js"></script>

urls.py

(r'^admin/jsi18n/', 'django.views.i18n.javascript_catalog'),
Απαντήθηκε 02/12/2009 στις 15:29
πηγή χρήστη

ψήφοι
4

Η παρακάτω θα εργαστεί επίσης ως ύστατη λύση, αν το παραπάνω αποτύχει

class PaymentsForm(forms.ModelForm):
    class Meta:
        model = Payments

    def __init__(self, *args, **kwargs):
        super(PaymentsForm, self).__init__(*args, **kwargs)
        self.fields['date'].widget = SelectDateWidget()

Το ίδιο με

class PaymentsForm(forms.ModelForm):
    date = forms.DateField(widget=SelectDateWidget())

    class Meta:
        model = Payments

βάλτε αυτό το forms.py σας from django.forms.extras.widgets import SelectDateWidget

Απαντήθηκε 07/03/2010 στις 17:09
πηγή χρήστη

ψήφοι
5

Τελικά κατάφερε να πάρει αυτό το widget που εργάζονται στο διακομιστή dev, μόνο για να έχουν σπάσει από την εγκατάσταση. Τελικά αποφάσισα ότι δεν άξιζε shoehorning στην ιστοσελίδα μου, και έγραψε τη δική μου widget. Δεν είναι τόσο ευέλικτο, αλλά αυτό θα λειτουργήσει πιθανότατα και για πολλούς: http://www.copiesofcopies.org/webl/?p=81

Απαντήθηκε 26/04/2010 στις 22:17
πηγή χρήστη

ψήφοι
10

Ξεκινώντας από το Django 1.2 RC1, αν χρησιμοποιείτε το Django ημερομηνία διαχειριστή επιλογής widge κόλπο, τα ακόλουθα πρέπει να προστεθούν στο πρότυπό σας, ή θα δείτε το εικονίδιο του ημερολογίου url που αναφέρονται με «/ λείπει-admin-media-πρόθεμα /».

{% load adminmedia %} /* At the top of the template. */

/* In the head section of the template. */
<script type="text/javascript">
window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";
</script>
Απαντήθηκε 12/05/2010 στις 12:03
πηγή χρήστη

ψήφοι
6

(Προσπαθώ να σχολιάσω ανθρώπους που προτείνει να κατασκευάζουν τα δικά τους widget ημερολογίου, αλλά είτε δεν βλέπω το κουμπί σχόλιο, ή δεν έχω αρκετό ύφασμα.)

Τι συνέβη με DRY ; Νομίζω ότι θα ήταν καλύτερο να χρησιμοποιήσετε ξανά το διαχειριστή widget, αλλά ίσως θα πρέπει να διαχωριστεί από το admin, και πιο εύκολο στη χρήση. Ευχαριστώ για τις πληροφορίες αυτές ούτως ή άλλως.

Απαντήθηκε 19/07/2010 στις 21:38
πηγή χρήστη

ψήφοι
3

Τι γίνεται μόνο για την έκδοση μιας τάξης για να widget σας και στη συνέχεια δεσμευτική αυτή την κατηγορία προς το datepicker JQuery;

Django forms.py:

class MyForm(forms.ModelForm):

  class Meta:
    model = MyModel

  def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)
    self.fields['my_date_field'].widget.attrs['class'] = 'datepicker'

Και μερικοί την Javascript για το πρότυπο:

  $(".datepicker").datepicker();
Απαντήθηκε 04/02/2012 στις 07:50
πηγή χρήστη

ψήφοι
9

Κωδικός κεφάλι μου για 1.4 έκδοση (μερικά νέα και μερικοί αφαιρεθεί)

{% block extrahead %}

<link rel="stylesheet" type="text/css" href="` STATIC_URL `admin/css/forms.css"/>
<link rel="stylesheet" type="text/css" href="` STATIC_URL `admin/css/base.css"/>
<link rel="stylesheet" type="text/css" href="` STATIC_URL `admin/css/global.css"/>
<link rel="stylesheet" type="text/css" href="` STATIC_URL `admin/css/widgets.css"/>

<script type="text/javascript" src="/admin/jsi18n/"></script>
<script type="text/javascript" src="` STATIC_URL `admin/js/core.js"></script>
<script type="text/javascript" src="` STATIC_URL `admin/js/admin/RelatedObjectLookups.js"></script>
<script type="text/javascript" src="` STATIC_URL `admin/js/jquery.js"></script>
<script type="text/javascript" src="` STATIC_URL `admin/js/jquery.init.js"></script>
<script type="text/javascript" src="` STATIC_URL `admin/js/actions.js"></script>
<script type="text/javascript" src="` STATIC_URL `admin/js/calendar.js"></script>
<script type="text/javascript" src="` STATIC_URL `admin/js/admin/DateTimeShortcuts.js"></script>

{% endblock %}
Απαντήθηκε 12/07/2012 στις 08:06
πηγή χρήστη

ψήφοι
0

Στο Django 10. myproject / urls.py: στην αρχή της urlpatterns

  from django.views.i18n import JavaScriptCatalog

urlpatterns = [
    url(r'^jsi18n/$', JavaScriptCatalog.as_view(), name='javascript-catalog'),
.
.
.]

Σε template.html μου:

{% load staticfiles %}

    <script src="{% static "js/jquery-2.2.3.min.js" %}"></script>
    <script src="{% static "js/bootstrap.min.js" %}"></script>
    {# Loading internazionalization for js #}
    {% load i18n admin_modify %}
    <script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>
    <script type="text/javascript" src="{% static "/admin/js/jquery.init.js" %}"></script>

    <link rel="stylesheet" type="text/css" href="{% static "/admin/css/base.css" %}">
    <link rel="stylesheet" type="text/css" href="{% static "/admin/css/forms.css" %}">
    <link rel="stylesheet" type="text/css" href="{% static "/admin/css/login.css" %}">
    <link rel="stylesheet" type="text/css" href="{% static "/admin/css/widgets.css" %}">



    <script type="text/javascript" src="{% static "/admin/js/core.js" %}"></script>
    <script type="text/javascript" src="{% static "/admin/js/SelectFilter2.js" %}"></script>
    <script type="text/javascript" src="{% static "/admin/js/admin/RelatedObjectLookups.js" %}"></script>
    <script type="text/javascript" src="{% static "/admin/js/actions.js" %}"></script>
    <script type="text/javascript" src="{% static "/admin/js/calendar.js" %}"></script>
    <script type="text/javascript" src="{% static "/admin/js/admin/DateTimeShortcuts.js" %}"></script>
Απαντήθηκε 09/10/2016 στις 17:39
πηγή χρήστη

ψήφοι
0

Χρησιμοποιώ αυτό, είναι μεγάλη, αλλά έχω 2 προβλήματα με το πρότυπο:

  1. Βλέπω τις εικόνες του ημερολογίου δύο φορές για κάθε κατατεθεί στο πρότυπο.
  2. Και για TimeField έχω » Εισάγετε μια έγκυρη ημερομηνία. »

    Εδώ είναι ένα στιγμιότυπο του εντύπου

models.py

from django.db import models
    name=models.CharField(max_length=100)
    create_date=models.DateField(blank=True)
    start_time=models.TimeField(blank=False)
    end_time=models.TimeField(blank=False)

forms.py

from django import forms
from .models import Guide
from django.contrib.admin import widgets

class GuideForm(forms.ModelForm):
    start_time = forms.DateField(widget=widgets.AdminTimeWidget)
    end_time = forms.DateField(widget=widgets.AdminTimeWidget)
    create_date = forms.DateField(widget=widgets.AdminDateWidget)
    class Meta:
        model=Guide
        fields=['name','categorie','thumb']
Απαντήθηκε 21/07/2018 στις 19:26
πηγή χρήστη

ψήφοι
0

Για Django> = 2,0

Σημείωση: Χρησιμοποιώντας το admin widgets για τα πεδία ημερομηνίας-ώρας δεν είναι μια καλή ιδέα ως διαχειριστής στυλ-φύλλων μπορεί να έρχονται σε σύγκρουση με το site στυλ-φύλλων σας σε περίπτωση που χρησιμοποιείτε εκκίνησης ή οποιαδήποτε άλλα πλαίσια CSS. Εάν χτίζετε το site σας εκκίνησης χρήση μου εκκίνησης-datepicker widget Django-εκκίνησης-datepicker-plus .

Βήμα 1: Προσθέστε javascript-catalogτο URL για να (μην εφαρμογής) του έργου σας urls.pyαρχείο.

from django.views.i18n import JavaScriptCatalog

urlpatterns = [
    path('jsi18n', JavaScriptCatalog.as_view(), name='javascript-catalog'),
]

Βήμα 2: Προσθήκη απαιτούμενο πόρων JavaScript / CSS στο πρότυπό σας.

<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>
<script type="text/javascript" src="{% static '/admin/js/core.js' %}"></script>
<link rel="stylesheet" type="text/css" href="{% static '/admin/css/widgets.css' %}">
<style>.calendar>table>caption{caption-side:unset}</style><!--caption fix for bootstrap4-->
` form`.`media `        {# Form required JS and CSS #}

Βήμα 3: Χρησιμοποιήστε το admin widgets για πεδία εισαγωγής ημερομηνία-ώρα σε σας forms.py.

from django.contrib.admin import widgets
from .models import Product

class ProductCreateForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name', 'publish_date', 'publish_time', 'publish_datetime']
        widgets = {
            'publish_date': widgets.AdminDateWidget,
            'publish_time': widgets.AdminTimeWidget,
            'publish_datetime': widgets.AdminSplitDateTime,
        }
Απαντήθηκε 17/08/2018 στις 10:36
πηγή χρήστη

ψήφοι
0

Django εγκατάστασης μου: 1.11 Bootstrap: 3.3.7

Δεδομένου ότι καμία από τις απαντήσεις είναι απολύτως σαφής, είμαι μοιράζονται τον κωδικό πρότυπο μου, η οποία δεν παρουσιάζει λάθη σε όλα.

Πάνω μισό του προτύπου:

{% extends 'base.html' %}
{% load static %}
{% load i18n %}

{% block head %}
    <title>Add Interview</title>
{% endblock %}

{% block content %}

<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>
<script type="text/javascript" src="{% static 'admin/js/core.js' %}"></script>
<link rel="stylesheet" type="text/css" href="{% static 'admin/css/forms.css' %}"/>
<link rel="stylesheet" type="text/css" href="{% static 'admin/css/widgets.css' %}"/>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" >
<script type="text/javascript" src="{% static 'js/jquery.js' %}"></script>

Κάτω Μισό:

<script type="text/javascript" src="/admin/jsi18n/"></script>
<script type="text/javascript" src="{% static 'admin/js/vendor/jquery/jquery.min.js' %}"></script>
<script type="text/javascript" src="{% static 'admin/js/jquery.init.js' %}"></script>
<script type="text/javascript" src="{% static 'admin/js/actions.min.js' %}"></script>
{% endblock %}
Απαντήθηκε 11/03/2019 στις 10:22
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more