জ্যাঙ্গোর চরফিল্ডে আমি কীভাবে কোনও স্থানধারক যুক্ত করব?


195

উদাহরণস্বরূপ এটি খুব সহজ ফর্ম নিন:

class SearchForm(Form):
    q = forms.CharField(label='search')

এটি টেমপ্লেটে রেন্ডার হয়:

<input type="text" name="q" id="id_q" />

তবে, placeholderএই মানটির সাথে আমি এই ক্ষেত্রটিতে বৈশিষ্ট্যটি যুক্ত Searchকরতে চাই যাতে এইচটিএমএল দেখতে এমন কিছু লাগে :

<input type="text" name="q" id="id_q" placeholder="Search" />

অগ্রাধিকার হিসাবে আমি CharFieldকোনও অভিধান বা এর মতো কোনও মাধ্যমে ফর্ম শ্রেণিতে স্থানধারকের মানটি পাস করতে চাই:

q = forms.CharField(label='search', placeholder='Search')

এটি সম্পাদন করার সর্বোত্তম উপায় কী হবে?

উত্তর:


281

উইজেট ডকুমেন্টেশন । মূলত এটি দেখতে হবে:

q = forms.CharField(label='search', 
                    widget=forms.TextInput(attrs={'placeholder': 'Search'}))

আরও লেখা, হ্যাঁ, তবে পৃথকীকরণ আরও জটিল মামলার আরও ভাল বিমূর্তনের অনুমতি দেয়।

আপনি নিজের উপ-শ্রেণীর সরাসরি ম্যাপিং যুক্ত একটি widgetsবৈশিষ্ট্যও ঘোষণা করতে পারেন ।<field name> => <widget instance>MetaModelForm


ঘোষণা করার জন্য forms.TextInputআপনার কি নির্দিষ্ট করা দরকার attrs={'placeholder': 'Search'}?
JhovaniC

1
@OvedD, আমি জানি এই পুরোনো, কিন্তু এই প্রশ্ন দেখুন: stackoverflow.com/questions/4341739/...
NotSimon

1
@ ওভেডডি: মডেলফর্ম দিয়ে এটি কীভাবে করবেন তার জন্য আমার উত্তর দেখুন
হামিশ ডাউনার

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


60

কোনও মডেলফর্মের জন্য আপনি মেটা ক্লাসটি এভাবে ব্যবহার করতে পারেন:

from django import forms

from .models import MyModel

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        widgets = {
            'name': forms.TextInput(attrs={'placeholder': 'Name'}),
            'description': forms.Textarea(
                attrs={'placeholder': 'Enter description here'}),
        }

মনে রাখবেন যে এক্ষেত্রে আপনি শ্রেণীর বডিতে ক্ষেত্রটি নির্দিষ্ট করতে পারবেন না।
উইল এস

এটি ছিল আমার পক্ষে সবচেয়ে সহজ পদ্ধতি - এবং এটি খুব ভাল ছিল যে অন্য সমস্ত বৈশিষ্ট্যগুলি (অর্থাত্ প্রয়োজনীয়) এখনও সেগুলি নির্দিষ্ট না করে আমাকে স্বয়ংক্রিয়ভাবে যুক্ত করা হয়েছিল।
JxAxMxIxN

41

অন্যান্য পদ্ধতি সব ভাল। তবে আপনি যদি ক্ষেত্রটি নির্দিষ্ট না করতে পছন্দ করেন (যেমন কিছু গতিশীল পদ্ধতির জন্য), আপনি এটি ব্যবহার করতে পারেন:

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)
    self.fields['email'].widget.attrs['placeholder'] = self.fields['email'].label or 'email@address.nl'

এটি স্থানধারককে উদাহরণস্বরূপ মডেলফোর্ডগুলির জন্য উদাহরণের উপর নির্ভর করতে দেয়।


7
এটি দুর্দান্ত কারণ এটি আরও জটিল সামগ্রীর জন্য যেমন উইজেটগুলির দীর্ঘতর ইনস্ট্যান্টেশনকে নকল করতে এড়িয়ে চলে ModelMultipleChoiceField। ধন্যবাদ!
অনর্থক

1
অনুরূপ স্পিরিট: for f in MyCommentForm.base_fields.values(): f.widget.attrs["placeholder"] = f.labelতবে আমি আপনার কনস্ট্রাক্টর পদ্ধতিটি আরও ভাল পছন্দ করি।
জোজকিয়াক্ক

21

আপনার গঠনের প্রতিটি পাঠ্য ইনপুট ক্ষেত্রের জন্য স্থানধারক অ্যাটর যুক্ত করতে আপনি এই কোডটি ব্যবহার করতে পারেন। স্থানধারীদের জন্য পাঠ্য মডেল ফিল্ড লেবেল থেকে নেওয়া হবে।

class PlaceholderDemoForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PlaceholderDemoForm, self).__init__(*args, **kwargs)
        for field_name in self.fields:
            field = self.fields.get(field_name)  
            if field:
                if type(field.widget) in (forms.TextInput, forms.DateInput):
                    field.widget = forms.TextInput(attrs={'placeholder': field.label})

    class Meta:
        model = DemoModel

19

দুর্দান্ত প্রশ্ন। আমি তিনটি সমাধান সম্পর্কে জানতে পারি:

সমাধান # 1

ডিফল্ট উইজেট প্রতিস্থাপন করুন।

class SearchForm(forms.Form):  
    q = forms.CharField(
            label='Search',
            widget=forms.TextInput(attrs={'placeholder': 'Search'})
        )

সমাধান # 2

ডিফল্ট উইজেট কাস্টমাইজ করুন। আপনি যদি ক্ষেত্রটি সাধারণত একই উইজেট ব্যবহার করেন তবে সম্পূর্ণ নতুনটিকে ইনস্ট্যান্ট করার পরিবর্তে আপনি কেবল সেইটিকেই কাস্টমাইজ করতে পারেন।

class SearchForm(forms.Form):  
    q = forms.CharField(label='Search')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['q'].widget.attrs.update({'placeholder': 'Search'})

সমাধান # 3

অবশেষে, আপনি যদি কোনও মডেল ফর্ম নিয়ে কাজ করছেন তবে ( পূর্ববর্তী দুটি সমাধানের পাশাপাশি ) আপনার widgetsঅভ্যন্তর Metaশ্রেণীর বৈশিষ্ট্য নির্ধারণ করে কোনও ক্ষেত্রের জন্য কাস্টম উইজেট নির্দিষ্ট করার বিকল্প রয়েছে ।

class CommentForm(forms.ModelForm):  
    class Meta:
        model = Comment
        widgets = {
            'body': forms.Textarea(attrs={'cols': 80, 'rows': 20})
        }

1
আমি আপনার # 2 হিসাবে একটি সমাধান লিখতে চলেছিলাম। আমি যুক্ত করতে চাই যে আপনি পুনরাবৃত্তি করে সমস্ত ক্ষেত্রে অপারেশন প্রয়োগ করতে পারেন self.fields, যেমন:for field_name in self.fields: self.fields[field_name].widget.attrs.update({"placeholder": sth})
আলবার্তো চিউসোল

@ অ্যালবার্তো চিউসোল হ্যাঁ আপনি করতে পারেন, যদি আপনি যা করতে চান তবে তা করুন। এটা ইশারা জন্য ধন্যবাদ।
ডোয়াইন ক্রুকস

@ ডোয়াইন ক্রুকস আমি আপনাকে সিডোসোবারের সমাধান অনুসারে আপনার # 3 আপডেট করার পরামর্শ দিচ্ছি , কারণ এটি দীর্ঘতর এবং আরও পাঠযোগ্য।
মারিয়ান

1

যখন আপনি কেবলমাত্র স্থানধারককে ওভাররাইড করতে চান তখন কোনও উইজেট কীভাবে ইনস্ট্যান্ট করবেন তা জেনে রাখা অনাকাঙ্ক্ষিত।

    q = forms.CharField(label='search')
    ...
    q.widget.attrs['placeholder'] = "Search"

0

বেশিরভাগ সময় আমি কেবলমাত্র আমার মডেলগুলিতে সংজ্ঞাযুক্ত ক্ষেত্রের ভার্বোজের নামের সমান সকল স্থানধারককে রাখতে চাই

আমি যে কোনও রূপ তৈরি করি তা সহজেই এটি করতে আমি একটি মিশ্রণ যোগ করেছি,

class ProductForm(PlaceholderMixin, ModelForm):
    class Meta:
        model = Product
        fields = ('name', 'description', 'location', 'store')

এবং

class PlaceholderMixin:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs):
        field_names = [field_name for field_name, _ in self.fields.items()]
        for field_name in field_names:
            field = self.fields.get(field_name)
            field.widget.attrs.update({'placeholder': field.label})

-2

আপনার পদ্ধতিটি দেখার পরে, আমি এটি সমাধান করার জন্য এই পদ্ধতিটি ব্যবহার করেছি।

class Register(forms.Form):
    username = forms.CharField(label='用户名', max_length=32)
    email = forms.EmailField(label='邮箱', max_length=64)
    password = forms.CharField(label="密码", min_length=6, max_length=16)
    captcha = forms.CharField(label="验证码", max_length=4)

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    for field_name in self.fields:
        field = self.fields.get(field_name)
        self.fields[field_name].widget.attrs.update({
            "placeholder": field.label,
            'class': "input-control"
        })

2
দয়া করে নোট করুন যে সামগ্রীগুলি স্ট্যাক ওভারফ্লোতে ইংরেজিতে থাকতে হবে। এর বাইরে, উপরে উত্থাপিত প্রশ্নের উত্তর না দিয়ে এটি একটি "আমিও" পোস্ট বলে মনে হচ্ছে।
টাইলারএইচ

আমি বলব যে "আমিও" পোস্টগুলি যদি তারা আরও বিশদ যুক্ত করে তবে ঠিক আছে। এই পদ্ধতির সম্পর্কে অন্যদের কারও থেকে আলাদা? এখানে কৌশল বা প্রয়োজনীয় শিখন কী?
অর্ধেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.