özel formunda Django saat / tarih widget'ları kullanarak

oy
158

Nasıl varsayılan yönetici benim özel görünümü ile kullandığı şık JavaScript tarih ve saat widget kullanabilirim?

İçinden baktım Django formları dokümantasyon ve kısaca django.contrib.admin.widgets bahseder, ancak bunu nasıl kullanılacağını bilmiyor musunuz?

İşte ben o uygulanır istiyorum benim şablondur.

<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, ben gerçekten, ben genel bir görünümünü kullanıyorum bu form için kendim kadar bir görünüm yazmadım unutulmamalıdır düşünüyorum. İşte url.py gelen giriştir:

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

Ve ben bütün Django / MVC / MTV şey görece yeni duyuyorum, o kadar kolay gidin lütfen ...

Oluştur 01/09/2008 saat 22:22
kaynak kullanıcı
Diğer dillerde...                            


16 cevaplar

oy
149

Zaman içinde bu cevabın büyüyen karmaşıklığı ve gerekli birçok kesmek, muhtemelen hiç bunu karşı dikkatli olmalı. Bu yöneticinin belgesiz iç uygulama ayrıntılarını güvenmek oluyor, Django gelecekteki sürümlerinde yeniden kırmaya olasıdır ve sadece başka JS takvim widget'ı bulma ve o kullanmaktan daha uygulamak için hiç kolay değildir.

Yani burada bu işi yapmaya karar eğer yapmak zorunda budur, şunları söyledi:

  1. Modeliniz için kendi ModelForm alt sınıfı tanımlayın (en iyi uygulamanızda forms.py koymak) ve AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (modelinizden uygun alan adları ile 'mydate' vb değiştirin) kullanmak için bunu söylemek:

    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. ProductForm yerine 'modeli': 'form_class' geçmek için URLconf değiştirin jenerik create_object görünümüne Ürünü ( "my_app.models Ürünü ithal gelen" tabii ki, "my_app.forms ProductForm içe gelen" yerine anlamına edeceğiz).

  3. Şablonunuzun Kafanın içinde, çıkışa JavaScript dosyalarına bağlantılar `form`.`media` sayılabilir.

  4. Ve hacky kısmı: yönetici tarih / saat widget i18n JS şeyler yüklenen edildiğini tahmin ve ayrıca core.js gerektirir, ancak otomatik ikisini de sağlamaz. Yukarıda Şablonunuzdaki Yani `` form`.`media gerekir:

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

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

    <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 (ADMIN_MEDIA_PREFIX) Django yönetici medya / medya / yönetici altında olduğunu ima / - Eğer kurulum için bunu değiştirebilirsiniz. İdeal bunu hardcoding yerine Şablonunuza bu değerler geçirmek için bir bağlam işlemci kullanmayı tercih ediyorum, ama bu soruya kapsamı dışındadır.

Bu aynı zamanda gerektirir URL / my_admin / jsi18n / (eğer i18n kullanmıyorsanız veya null_javascript_catalog) elle django.views.i18n.javascript_catalog görünüme kablolanmalıdır. Önemsemeden yönetici (teşekkürler giriş yaptığınız bakılmaksızın erişilebilir böylece yerine yönetici uygulaması geçiyor bu kendiniz yapmak zorunda Jeremy bu işaret için). Senin URLconf için örnek kod:

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

Son olarak, Django 1.2 kullanıyorsanız ya da geç, widget'ları medyalarını bulmalarına yardımcı olmak için şablonunda bazı ek kod gerekirse:

{% 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ür Lupe Fiasco bu ek için.

Cevap 02/09/2008 saat 05:10
kaynak kullanıcı

oy
62

Solüsyon hackish olduğu gibi bazı JavaScript daha uygulanabilir olması ile, ben kendi tarih / zaman widget kullanarak düşünüyorum.

Cevap 16/09/2008 saat 12:39
kaynak kullanıcı

oy
12

Evet, ben / admin / jsi18n / url geçersiz sona erdi.

İşte benim urls.py. ilave ne Emin ol / admin / url yukarıda bulunuyor

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

Ve burada benim yarattığım i18n_javascript fonksiyonudur.

from django.contrib import admin
def i18n_javascript(request):
  return admin.site.i18n_javascript(request)
Cevap 02/01/2009 saat 21:53
kaynak kullanıcı

oy
7

Carl Meyer tarafından cevap tamamlayan ben size şablonu içinde (başlığındaki içinde) bazı geçerli binadaki o başlık koymak gerektiğini yorum yapmak istiyorum.

{% 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 %}
Cevap 05/04/2009 saat 19:02
kaynak kullanıcı

oy
10

Kendimi bu çok yazılan referans bulmak ve tespit belgeler bir tanımlamaktadır hafifçe varsayılan widget'lar geçersiz kılmak için az hacky yolu.

( ModelForm en __init__ yöntemi geçersiz gerek yok )

Ancak, yine de Carl bahseder gibi uygun bir şekilde JS ve CSS tel gerekir.

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

Referans Alan türleri varsayılan form alanlarını bulmak için.

Cevap 08/09/2009 saat 05:42
kaynak kullanıcı

oy
1

Için çözüm ve geçici çözüm Güncelleme SplitDateTime ile gerekli = 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'),
Cevap 02/12/2009 saat 13:29
kaynak kullanıcı

oy
4

Yukarıda başarısız olursa aşağıda da son çare olarak çalışacak

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

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

İle aynı

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

    class Meta:
        model = Payments

senin forms.py bu koymak from django.forms.extras.widgets import SelectDateWidget

Cevap 07/03/2010 saat 15:09
kaynak kullanıcı

oy
5

Sonunda sadece dağıtım üzerinde kırmak için, dev sunucuda çalışan bu widget'ı başardı. Sonunda benim siteye shoehorning değmez olduğuna karar verdi ve kendi widget'ı yazdı. O kadar esnek değil, ama muhtemelen birçok da iyi görüneceği: http://www.copiesofcopies.org/webl/?p=81

Cevap 26/04/2010 saat 20:17
kaynak kullanıcı

oy
10

Django yönetici tarih seçici widge hile kullanıyorsanız, Django 1.2 RC1 başlayarak, şu Şablonunuza eklenecek varsa veya takvim simgesi url "/ eksik-admin-media-önek üzerinden başvuruluyor göreceksiniz /".

{% 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>
Cevap 12/05/2010 saat 10:03
kaynak kullanıcı

oy
6

(Ben kendi Takvim widget'ı yuvarlanmaya düşündüren insanlar üzerinde yorum yapmak çalışıyorum ancak Ya ben yorum düğmesini görmüyorum, yoksa yeterince temsilcisi yok.)

Ne oldu KURU ? Ben yönetici widget'ı yeniden kullanmak en iyisi bu olur, ama belki de yöneticiden ayrılmalıdır ve kullanımı daha kolay. Neyse bu bilgiler için teşekkür ederiz.

Cevap 19/07/2010 saat 19:38
kaynak kullanıcı

oy
3

Ne sadece JQuery datepicker için o sınıfı bağlayıcı sonra widget'ınızda için bir sınıf atama ve yaklaşık?

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'

Ve Şablon için bazı JavaScript:

  $(".datepicker").datepicker();
Cevap 04/02/2012 saat 04:50
kaynak kullanıcı

oy
9

1.4 sürümü için başım kodu (bazı yeni ve bazı kaldırıldı)

{% 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 %}
Cevap 12/07/2012 saat 06:06
kaynak kullanıcı

oy
0

Django 10. myproject / urls.py olarak: urlpatterns başında

  from django.views.i18n import JavaScriptCatalog

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

Benim template.html olarak:

{% 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>
Cevap 09/10/2016 saat 16:39
kaynak kullanıcı

oy
0

Bunu kullanmak, bu da harika, ama şablonla 2 sorunları var:

  1. Ben takvim simgesi görmek iki kez şablonda dosyalanan her için.
  2. Ve TimeField parasını ben var Geçerli bir tarih girin. '

    İşte Formunun bir ekran görüntüsü

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']
Cevap 21/07/2018 saat 18:26
kaynak kullanıcı

oy
0

Django için> = 2.0

Not: Yönetici stil sayfaları size ön yükleme alanı veya başka bir CSS çerçeveler kullanırken durumda sitenizin stil sayfalarında çakışabilir olarak tarih-saat alanları için yönetici widget kullanmak iyi bir fikir değildir. Eğer açılışta sitenizin benim önyükleme-datepicker Widget kullanmak bina varsa Django-önyükleme-datepicker-artı .

1. Adım: Ekle javascript-catalogprojenizin (değil uygulamanın) URL'yi urls.pydosyası.

from django.views.i18n import JavaScriptCatalog

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

2. Adım: Şablonunuza gerekli JavaScript / CSS kaynağı ekleyin.

<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. Adım: Gözlerinde farklı tarih-saat giriş alanları için yönetici widget kullanın 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,
        }
Cevap 17/08/2018 saat 09:36
kaynak kullanıcı

oy
0

Benim Django Kurulumu: 1.11 Bootstrap: 3.3.7

cevapların hiçbiri tamamen açık olduğundan, tüm hiçbir hataları sunar benim şablon kodunu paylaşıyorum.

şablonun Üst Yarım:

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

Alt yarısı:

<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 %}
Cevap 11/03/2019 saat 08:22
kaynak kullanıcı

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