python কাস্টম ফর্ম Django সময়/তারিখ উইজেট ব্যবহার করে



(10)

Django> = 2.0 জন্য

দ্রষ্টব্য: তারিখ-সময় ক্ষেত্রগুলির জন্য অ্যাডমিন উইজেটগুলি ব্যবহার করা কোনও ভাল ধারণা নয় কারণ অ্যাডমিন স্টাইল-শীটগুলি আপনার সাইট শৈলী-শিটগুলির সাথে দ্বন্দ্ব করতে পারে যদি আপনি বুটস্ট্র্যাপ বা অন্য কোন CSS ফ্রেমওয়ার্ক ব্যবহার করেন। আপনি যদি বুটস্ট্র্যাপে আপনার সাইটটি তৈরি করেন তবে আমার বুটস্ট্র্যাপ-ডেটাপিকার উইজেট django django-bootstrap-datepicker-plus

ধাপ 1: আপনার প্রোজেক্টের (অ্যাপ্লিকেশানগুলির) urls.py ফাইলটিতে javascript-catalog URL যোগ করুন।

from django.views.i18n import JavaScriptCatalog

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

পদক্ষেপ 2: আপনার টেমপ্লেটে প্রয়োজনীয় জাভাস্ক্রিপ্ট / 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: আপনার 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,
        }

https://ffff65535.com

ডিফল্ট অ্যাডমিন আমার কাস্টম ভিউ ব্যবহার করে কীভাবে আমি নিফটি জাভাস্ক্রিপ্ট তারিখ এবং সময় উইজেট ব্যবহার করতে পারি?

আমি Django ফর্ম ডকুমেন্টেশনের মাধ্যমে দেখেছি, এবং এটি briefly 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 / এমভিসি / এমটিভি জিনিস প্রাসঙ্গিকভাবে নতুন, তাই দয়া করে সহজ যান ...


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

Django 10. আমার প্রোজেক্ট / 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>

আপনার উইজেটে কেবল একটি শ্রেণির বরাদ্দকরণ এবং তারপরে সেই ক্লাসটিকে JQuery তারিখপিকারে সীমাবদ্ধ করার বিষয়ে কী?

Django ফর্ম.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'

এবং কিছু জাভাস্ক্রিপ্ট টেমপ্লেট জন্য:

  $(".datepicker").datepicker();

আমি এটি ব্যবহার করি, এটি দুর্দান্ত, তবে আমার কাছে টেমপ্লেটের সাথে দুটি সমস্যা রয়েছে:

  1. আমি টেমপ্লেট দায়ের প্রতিটি জন্য ক্যালেন্ডার আইকন দুইবার দেখতে।
  2. এবং টাইমফিল্ডের জন্য ' একটি বৈধ তারিখ লিখুন। '

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

আমি নিজেকে এই পোস্টটি উল্লেখ করে অনেক খুঁজে পেয়েছি এবং এটি দেখেছি যে documentation ডিফল্ট উইজেটগুলিকে ওভাররাইড করার জন্য সামান্য কম হ্যাকি পদ্ধতি সংজ্ঞায়িত করে।

( ModelForm এর __init__ পদ্ধতিটি ওভাররাইড করার প্রয়োজন নেই )

যাইহোক, আপনি এখনও কার্ল উল্লেখ হিসাবে আপনার JS এবং CSS সঠিকভাবে তারের প্রয়োজন।

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

ডিফল্ট ফর্ম ক্ষেত্র খুঁজে পেতে রেফারেন্স ক্ষেত্রের ধরন


কার্ল মেয়ের দ্বারা উত্তরটি সরবরাহ করা, আমি মন্তব্য করতে চাই যে আপনাকে আপনার শিরোনামের মধ্যে কিছু বৈধ ব্লক (শিরোলেখের অভ্যন্তরে) শিরোনামটি রাখতে হবে।

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

সময়ের সাথে সাথে এই উত্তরটির ক্রমবর্ধমান জটিলতা এবং অনেক হ্যাকগুলি প্রয়োজনীয়, সম্ভবত এগুলি করার জন্য আপনাকে সতর্ক করা উচিত। এটি অ্যাডমিনের অননুমোদিত অভ্যন্তরীণ বাস্তবায়ন সম্পর্কিত তথ্যের উপর নির্ভর করে, Django এর ভবিষ্যতের সংস্করণগুলিতে আবার ভাঙ্গা যায় এবং এটি অন্য কোনও কেবল ক্যালেন্ডার উইজেট খুঁজে পেতে এবং এর ব্যবহার করার চেয়ে প্রয়োগ করা সহজ নয়।

যে বলেন, আপনি এই কাজ করতে দৃঢ়প্রতিজ্ঞ যদি আপনি কি করতে হবে এখানে:

  1. আপনার মডেলের জন্য আপনার নিজস্ব মডেলফর্ম সাবক্লাসটি নির্ধারণ করুন (এটি আপনার অ্যাপ্লিকেশানে form.py এটিকে সেরা হিসাবে সাজানো), এবং এটি প্রশাসক ডেট উইডগেট / অ্যাডমিনটাইম উইডগেট / অ্যাডমিনসপ্লিটডেটটাইম ('মাদেট' ইত্যাদি আপনার মডেল থেকে সঠিক ক্ষেত্রের নামের সাথে প্রতিস্থাপন করুন) ব্যবহার করতে বলুন।

    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. 'Form_class' পাস করার জন্য আপনার URL কনফিগার করুন: মডেলের পরিবর্তে ProductForm: জেনারিক create_object ভিউতে পণ্য (অবশ্যই "my_app.models আমদানি পণ্য" এর পরিবর্তে "my_app.forms আমদানি পণ্যফর্ম" এর অর্থ হবে)।

  3. আপনার টেম্পলেটের শিরোনামে, জাভাস্ক্রিপ্ট ফাইলগুলির লিঙ্কগুলি আউটপুট করতে {{form.media}} অন্তর্ভুক্ত করুন।

  4. এবং হ্যাকি অংশ: অ্যাডমিন তারিখ / সময় উইজেটগুলি মনে করে যে 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>

    আপনি নিম্নলিখিত অ্যাডমিন সিএসএস ব্যবহার করতে ইচ্ছুক হতে পারেন (এটি উল্লেখ করার জন্য 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"/>

এর অর্থ হল Django এর অ্যাডমিন মিডিয়া (ADMIN_MEDIA_PREFIX) / মিডিয়া / অ্যাডমিন / এ - আপনি সেটআপের জন্য এটি পরিবর্তন করতে পারেন। আদর্শভাবে আপনি হার্ডডকোডিংয়ের পরিবর্তে এই মানগুলি আপনার টেমপ্লেটে পাস করার জন্য একটি প্রসঙ্গ প্রসেসর ব্যবহার করবেন, তবে এটি এই প্রশ্নের সুযোগের বাইরে।

এটির URL / my_admin / jsi18n / নিজেও django.views.i18n.javascript_catalog ভিউতে (অথবা আইআইএলএন ব্যবহার না করলে null_javascript_catalog) আপলোড করা দরকার। অ্যাডমিন অ্যাপ্লিকেশনটি ব্যবহার করার পরিবর্তে আপনাকে এটি নিজে করতে হবে যাতে আপনি অ্যাডমিনে লগ ইন করেন কিনা তা অ্যাক্সেসযোগ্য (ধন্যবাদ Jeremy নির্দেশ করার জন্য)। আপনার ইউআরএল কনফারেন্সের নমুনা কোড:

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

অবশেষে, যদি আপনি Django 1.2 বা তার পরে ব্যবহার করেন তবে উইজেটগুলি তাদের মিডিয়া খুঁজে পেতে আপনার টেম্পলেটের কিছু অতিরিক্ত কোড দরকার:

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


হ্যাঁ, আমি শেষ / admin / jsi18n / url overriding শেষ।

আমার urls.py এ আমি যা যোগ করেছি তা এখানে। এটি / প্রশাসক / ইউআরএল উপরে নিশ্চিত করুন

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

এবং এখানে আমি তৈরি i18n_javascript ফাংশন।

from django.contrib import admin
def i18n_javascript(request):
  return admin.site.i18n_javascript(request)

প্রয়োজনীয় সমাধান এবং সমাধান সঙ্গে splitDateTime জন্য সমাধান = মিথ্যা :

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




django