জাঙ্গো: আমি কীভাবে কোনও ফর্মের ইনপুট ক্ষেত্রে স্বতন্ত্র html বৈশিষ্ট্য যুক্ত করব?


101

আমার কাছে একটি ইনপুট ক্ষেত্র রয়েছে যা এই জাতীয় টেমপ্লেটের সাথে রেন্ডার হয়:

<div class="field">
   {{ form.city }}
</div>

যা হিসাবে রেন্ডার করা হয়:

<div class="field">
    <input id="id_city" type="text" name="city" maxlength="100" />
</div>

এখন ধরুন আমি autocomplete="off"যে ইনপুট উপাদানটি রেন্ডার করা হয়েছে তাতে কোনও গুন যুক্ত করতে চাই, আমি কীভাবে এটি করব? অথবা onclick="xyz()"অথবা class="my-special-css-class"?

উত্তর:


126

এই পৃষ্ঠাটি দেখুন

city = forms.CharField(widget=forms.TextInput(attrs={'autocomplete':'off'}))

2
ঠিক আছে ধন্যবাদ. আমার ক্ষেত্রে আমি মডেলফর্ম ব্যবহার করছি তাই আমি ফর্ম ক্ষেত্রগুলি স্পষ্টভাবে সংজ্ঞায়িত করছি না (উদাহরণস্বরূপ শ্রেণি ঠিকানাফর্ম (ফর্মস.মোডেলফর্ম): শ্রেণি মেটা: মডেল = মডেল Aএড্রেস) এর অর্থ কি আমি মডেলফর্ম ব্যবহার করতে পারি না বা আমি এখানে বিশেষ কিছু আছে? যা করতে হবে?
ব্যবহারকারীর


1
ভিতরে @InfinitelyLoopy Init ফর্ম, আপনি ক্ষেত্র দখল এবং তার উইজেট বৈশিষ্ট্যাবলী পরিবর্তন করতে কিছু কোড যোগ করতে পারেন। এখানে 3 টি ক্ষেত্র সংশোধন করার জন্য আমি এখানে কিছু ব্যবহার করেছি: '`[[' চিত্র ',' ইমেজ_স্মল ',' চিত্র_মোবাইল '] তে ফিল্ড-নেমটির জন্য: ক্ষেত্র = স্ব.ফিল্ডস.জেট (ক্ষেত্রের নাম) ফিল্ড.উইজেট.অ্যাটরস [' ডেটা- ফাইল '] =' ফাইল '`` `
স্টুয়ার্ট অ্যাকসন

4
'প্রয়োজনীয়' এবং 'অটোফোকাস' এর মতো আর্গুমেন্ট গ্রহণ না করে এমন বৈশিষ্ট্যগুলি সম্পর্কে কী?
উইলহেলম ক্লপ্প

1
উদ্বেগের কোনও বিচ্ছেদ নেই বলে এই সমাধানটি খারাপ। এইচটিএমএল বৈশিষ্ট্যগুলি পাইথন কোড আইএমওতে লেখা উচিত নয়। মিখাইল কোরোভভ দ্রবণটি উন্নত।
ডেভিড ডি

115

বিজ্ঞাপন দেওয়ার জন্য দুঃখিত, তবে আমি সম্প্রতি একটি অ্যাপ্লিকেশন ( https://github.com/kmike/django-widget-tweaks ) প্রকাশ করেছি যা এই জাতীয় কাজগুলিকে আরও কম বেদনাদায়ক করে তোলে তাই ডিজাইনাররা পাইথন কোডটি স্পর্শ না করে এটি করতে পারে:

{% load widget_tweaks %}
...
<div class="field">
   {{ form.city|attr:"autocomplete:off"|add_class:"my_css_class" }}
</div>

বা, বিকল্পভাবে,

{% load widget_tweaks %}
...
<div class="field">
   {% render_field form.city autocomplete="off" class+="my_css_class" %}
</div>

3
দুর্দান্ত অ্যাপ মাইক, আমি যা খুঁজছিলাম ঠিক তাই!
jmagnusson

ডকুমেন্টেশন আপনাকে সেটিংসে আপনার ইনস্টল করা অ্যাপ্লিকেশনটিতে "উইজেট_টুইকস" যুক্ত করতে বলবে না, এটি ডকুমেন্টেশনে রাখার উপযুক্ত হতে পারে।
জেমস লিন

হাই জেমস, এটি চাপযুক্ত নয় তবে 'ইনস্টলেশন' বিভাগে ইতিমধ্যে ইনস্টলড_এপিপিএসে 'উইজেট_টুইকস' যুক্ত করার জন্য একটি নোট রয়েছে।
মিখাইল কোরোভভ

@ মিখাইলকোরোবভ এই অ্যাপটির জন্য আপনাকে অনেক ধন্যবাদ, এটি আমাকে অনেক সাহায্য করেছে! এই আমি ঠিক খুঁজছিলাম ছিল। আমার মডেলফর্মের একটি ফর্মের প্রয়োজন ছিল এবং প্রতিটি একক ক্ষেত্রের (এগুলির মধ্যে 40) ম্যানুয়ালি এই বৈশিষ্ট্যগুলি সন্নিবেশ করতে চাইনি, তাই আমি সেকেন্ডে একই ফলাফলটি সার্থকভাবে অর্জন করতে পেরেছি :) এটি গ্রহণযোগ্য উত্তর হওয়া উচিত!
লিজুবিসা লিভাক

আমি এই ধরনের আবেদন লেখার পরিকল্পনা ছিল। আমার প্রচেষ্টা সংরক্ষণ করার জন্য ধন্যবাদ।
অনুজ টিবিই

31

আপনি যদি "মডেলফর্ম" ব্যবহার করেন:

class YourModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(YourModelForm, self).__init__(*args, **kwargs)
        self.fields['city'].widget.attrs.update({
            'autocomplete': 'off'
        })

3
ভাল! এখন সমস্ত উইজেট স্পষ্টভাবে সংজ্ঞায়িত করার দরকার নেই।
মিকায়েল লিন্ডলফ

20

আপনি যদি তার উত্তরে প্রদত্ত @ আর্টিফিয়ু হিসাবে ModelFormব্যবহারের সম্ভাবনা বাদ দিয়ে ব্যবহার __init__করেন তবে widgetsসেই বিষয়ে মেটাতে একটি অভিধান রয়েছে:

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title', 'birth_date')
        widgets = {
            'name': Textarea(attrs={'cols': 80, 'rows': 20}),
        }

প্রাসঙ্গিক ডকুমেন্টেশন


1
উপরের উত্তরের চেয়ে কেন এগুলি কম উত্সাহ পেয়েছে তা জানার চেষ্টা করছি ... কখনও কখনও আমি মনে করি জ্যাঙ্গো / পাইথন বিকাশকারীরা কেবল জিনিসগুলি করার আরও শক্ত
উপায়টিকে

@ trpt4him ব্যবহার Init পদ্ধতির একটি Mixin বা বেস ক্লাস অন্যান্য ধরনের যে আপনি যা করতে পারেন পুনরায় ব্যবহার তৈরি করতে দরকারী। এটি মাঝারি থেকে বড় আকারের প্রকল্পের মধ্যে আদর্শ ical মেটা.ইউজেডস একক ফর্মের জন্য দুর্দান্ত। সুতরাং, উভয়ই ভাল উত্তর।
আখোরাস

2

আমি এই জিনিসটির জন্য একটি সম্পূর্ণ অ্যাপ্লিকেশন ব্যবহার করতে চাই না। পরিবর্তে আমি নীচের কোডটি এখানে পেয়েছি https://blog.joeymasip.com/how-to-add-attributes-to-form-widgets-in-django-templates/

# utils.py
from django.template import Library
register = Library()

@register.filter(name='add_attr')
def add_attr(field, css):
    attrs = {}
    definition = css.split(',')

    for d in definition:
        if ':' not in d:
            attrs['class'] = d
        else:
            key, val = d.split(':')
            attrs[key] = val

    return field.as_widget(attrs=attrs)

এইচটিএমএল ফাইলে ট্যাগটি ব্যবহার করুন

{% load utils %}
{{ form.field_1|add_attr:"class:my_class1 my_class2" }}
{{ form.field_2|add_attr:"class:my_class1 my_class2,autocomplete:off" }}

0

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

#forms.py
from django import forms
from user.models import User, UserProfile
from .models import Task, Transaction

class AddTransactionForm(forms.ModelForm):
    class Meta:
       model = Transaction
       exclude = ['ref_number',]
       required_css_class = 'required'

Views.py

@method_decorator(login_required, name='dispatch')
class TransactionView(View):
def get(self, *args, **kwargs):
    transactions = Transaction.objects.all()
    form = AddTransactionForm
    template = 'pages/transaction.html'
    context = {
        'active': 'transaction',
        'transactions': transactions,
        'form': form
    }
    return render(self.request, template, context)

def post(self, *args, **kwargs):
    form = AddTransactionForm(self.request.POST or None)
    if form.is_valid():
        form.save()
        messages.success(self.request, 'New Transaction recorded succesfully')
        return redirect('dashboard:transaction')
    messages.error(self.request, 'Fill the form')
    return redirect('dashboard:transaction')

এইচটিএমএল কোড দ্রষ্টব্য: অনেক ভিউ তৈরির ঝামেলা দূর করতে বুটস্ট্র্যাপ 4 মডেল ব্যবহার করছি। জেনেরিক ক্রিয়েভ ভিউ বা আপডেটভিউ ব্যবহার করা ভাল। লিংক বুটস্ট্র্যাপ এবং jqQery

 <div class="modal-body">
    <form method="post" class="md-form" action="." enctype="multipart/form-data">
      {% csrf_token %}
      {% for field in form %}
      <div class="row">
        <div class="col-md-12">
          <div class="form-group row">
            <label for="" class="col-sm-4 col-form-label {% if field.field.required %}
            required font-weight-bolder text-danger{%endif %}">{{field.label}}</label>
            <div class="col-sm-8">
              {{field}}
            </div>

          </div>
        </div>
      </div>

      {% endfor %}

      <input type="submit" value="Add Transaction" class="btn btn-primary">
    </form>
  </div>

জাভাস্ক্রিপ্ট কোড$(document).ready(function() { /* ... */}); ফাংশন এ লোড মনে রাখবেন ।

var $list = $("#django_form :input[type='text']");
$list.each(function () {
    $(this).addClass('form-control')
  });
  var $select = $("#django_form select");
  $select.each(function () {
    $(this).addClass('custom-select w-90')
  });
  var $list = $("#django_form :input[type='number']");
  $list.each(function () {
    $(this).addClass('form-control')
  });
  var $list = $("form :input[type='text']");
  $list.each(function () {
    $(this).addClass('form-control')
  });
  var $select = $("form select");
  $select.each(function () {
    $(this).addClass('custom-select w-90')
  });
  var $list = $("form :input[type='number']");
  $list.each(function () {
    $(this).addClass('form-control')
  });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.