SORU
1 EYLÜL 2008, PAZARTESİ


Django kullanarak tarih/saat özel form widget

Nasıl varsayılan admin benim özel görünümü ile kullanan şık JavaScript tarih ve saat widget kullanabilir miyim?

the Django forms documentation, aradım ve kısa bir süre django bahseder.contrib.admin.widget, ama nasıl kullanılacağını bilmiyorum?

Burada üzerinde uygulanan istediğim benim şablon.

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

Ayrıca, gerçekten bu form için kendimi bir görünüm yazmadım unutulmamalıdır sanırım, genel bir görünümünü kullanıyorum. İşte url.py giriş:

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

Ve bütün Django/MVC/MTV şey, bu yüzden lütfen git kolay duruma yeni duyuyorum...

CEVAP
2 EYLÜL 2008, Salı


Zaman içinde bu cevap Artan karmaşıklığı ve çok kesmek gerekli, muhtemelen bunların hiçbirini karşı dikkatli olmalı. Admin belgelenmemiş iç Uygulama Detayları güvenerek, yine Django sürümlerini kırmak için muhtemeldir, ve sadece başka bir JS takvim widget bulmak ve bunu kullanarak daha uygulamak daha kolaydır.

O, burada, eğer bu işi yapmak için kararlı iseniz yapmanız gereken şey bu " dedi

  1. Define kendi ModelForm alt sınıf için bir model (en iyi benzini koymak için forms.py senin app), ve bunu söylemek için kullanın AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (değiştir 'mydate' vb ile uygun alan adlarından model):

    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. Senin URLconf geçmek için Değiştir'': yerine 'model': ("my_app.yani olacak genel create_object görünümüne Ürün ProductForm form_class formlar" yerine "my_app.bu ProductForm al modelleri ithal Ürün", elbette).

  3. Şablon Başkanı. {{ form.medya }} bağlantılar Javascript dosyaları için. çıkış için

  4. Ve hacky bölüm: zaman widget/admin tarih i18n JS şeyler yüklendi, ve ayrıca core.js ama ikisinden birini otomatik olarak vermeyin gerektiren olmalısınız. Şablonunda çok {{ form.yukarıda medya }} ihtiyacınız olacak:

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

    Ayrıca aşağıdaki admin CSS (teşekkürler Alex bu söz için) kullanmak isteyebilirsiniz:

    <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"/>
    

Bu Django yönetici medya (ADMİN_MEDİA_PREFİX) / - kurulum için bunu değiştirebilirsiniz/admin/ media altında olduğunu ima eder. İdeal bir bağlam işlemci şablonu için bu değerleri aktarmak için hardcoding yerine kullanmak istiyorum, ama bu sorunun kapsamı dışındadır.

Bu da /my_admin/jsi18n/ URL el ile django için kablolu olması gerekir.manzarası.i18n.görünüm (veya eğer İ18N kullanarak değilse null_javascript_catalog) javascript_catalog. Bu kendini yönetici uygulama yerine yapmanız gereken erişilebilir yönetici (teşekkürler bu işaret için 16**) oturum bakılmaksızın. Senin URLconf için kod örneği:

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

Eğer Django 1.2 veya sonraki bir sürümünü kullanıyorsanız son olarak, şablon bazı ek kod parçacıkları kendi medya bulmanıza yardımcı olmak için ihtiyacınız:

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

Teşekkürler 17* *Bu ek için.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • cosmicrocketman

    cosmicrocket

    17 NİSAN 2006
  • Jay Will

    Jay Will

    19 NİSAN 2006
  • SDSARG3

    SDSARG3

    14 Mart 2009