একটি জ্যাঙ্গো ফর্ম ক্ষেত্রকে একটি লুকানো ক্ষেত্রে পরিবর্তন করুন


128

আমার সাথে একটি জ্যাঙ্গো ফর্ম রয়েছে RegexFieldযা একটি সাধারণ পাঠ্য ইনপুট ফিল্ডের সাথে খুব মিল।

আমার দৃষ্টিতে, নির্দিষ্ট শর্তে আমি এটি ব্যবহারকারীর কাছ থেকে আড়াল করতে চাই এবং ফর্মটি যথাসম্ভব অনুরূপ রাখার চেষ্টা করছি। এই ক্ষেত্রটি একটি HiddenInputক্ষেত্রের মধ্যে পরিণত করার সর্বোত্তম উপায় কোনটি ?

আমি জানি আমি এর সাথে মাঠে বৈশিষ্ট্যগুলি সেট করতে পারি:

form['fieldname'].field.widget.attr['readonly'] = 'readonly'

এবং আমি এটি দিয়ে পছন্দসই প্রাথমিক মান সেট করতে পারি:

form.initial['fieldname'] = 'mydesiredvalue'

যাইহোক, এটি উইজেটের ফর্ম পরিবর্তন করবে না।

এই ক্ষেত্রটি একটি <input type="hidden">ক্ষেত্র তৈরি করার সেরা / সর্বাধিক "জাঙ্গো-ওয়াই" / কমপক্ষে "হ্যাকি" উপায় কী?

উত্তর:


169

আপনার যদি কাস্টম টেম্পলেট থাকে এবং দেখুন আপনি ক্ষেত্রটি বাদ দিতে {{ modelform.instance.field }}পারেন এবং মান পেতে ব্যবহার করতে পারেন।

এছাড়াও আপনি এই দৃশ্যে ব্যবহার করতে পছন্দ করতে পারেন:

form.fields['field_name'].widget = forms.HiddenInput()

তবে আমি নিশ্চিত নই যে এটি পোস্টে সংরক্ষণের পদ্ধতিটি রক্ষা করবে।

আশা করি এটা সাহায্য করবে.


1
&quot;&quot; is not a valid value for a primary key.এই সমাধানটি ব্যবহার করার পরে আমি is_ अवैधानিক পদ্ধতিতে একটি দিয়ে শেষ করি ।
জেনস টিমারম্যান

অদ্ভুত লাগছে। আমি মনে করি এটি অন্য কোনও কিছুর সাথে সম্পর্কিত, আপনি কি তৈরি করছেন এমন অবজেক্টের প্রাথমিক কীটি হাইডইনপুট হিসাবে প্রদর্শন করছেন? হ্যাঁ, আপনি না করা উচিত।
খ্রিস্টোফে

হয়তো এটি না বলেই চলেছে তবে এটি কাজ করার আগে আপনাকে ফর্মগুলি আমদানি করতে হবে। from django import forms
teewuane

2
1.7 এ এই বাক্য গঠনটি ব্যবহার করুন: hidden_field_name = forms.CharField(label='reset', max_length=256, widget=forms.HiddenInput())যেখানে কীটি শেষের দিকে নতুন উইজেট সিনট্যাক্স। আপনার প্রয়োজনের জন্য ঝাঁকুনি।
মার্ক

195

এটি দরকারী হতে পারে: {{ form.field.as_hidden }}


3
এটি সেরা উত্তর আইএমএইচও। ফর্ম ক্ষেত্রের প্রদর্শন নির্ধারণ করতে আমি সর্বদা আমার "নিয়ামক" পাইথন কোডটি ব্যবহার করে ঘৃণা করি।
trpt4him

আমি প্রায়শই ক্রাইপাইফর্মগুলি সহ জেনেরিক ফর্ম টেম্পলেট তৈরি করি। আপনি যদি ক্রিস্পাইফর্মগুলি ব্যবহার করেন বা আপনি সাধারণ ফর্মআপে ক্ষেত্রগুলি প্রদর্শন করেন কারণ আপনি নিজের ফর্ম শ্রেণিতে আপনার ফর্ম কাঠামো চান, ফর্মটিতে উইজেট ওভাররাইড করা এটি করার ভাল উপায়। আপনি যদি আপনার ফর্মটি আপনার টেম্পলেটটিতে রেন্ডারিং পরিচালনা করেন তবে প্রকৃতপক্ষে, এই সমাধানটি আরও অনেক বেশি পরিষ্কার / পরিষ্কার।
christophe31

এটি লক্ষণীয় যে আপনি এই ক্ষেত্রটিতে আগে প্রয়োগ করেছেন এমন কোনও ক্লাস মুছে ফেলা বলে মনে হচ্ছে ...
জন অ্যারন

59

একটি বিকল্প যা আমার পক্ষে কাজ করেছে, ক্ষেত্রটিকে মূল ফর্মটিতে এটি সংজ্ঞায়িত করুন:

forms.CharField(widget = forms.HiddenInput(), required = False)

তারপরে আপনি যখন এটি নতুন ক্লাসে ওভাররাইড করবেন তখন এটি তার জায়গাটি রাখবে।


45

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

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
    def __init__(self, *args, **kwargs):
        from django.forms.widgets import HiddenInput
        hide_condition = kwargs.pop('hide_condition',None)
        super(MyModelForm, self).__init__(*args, **kwargs)
        if hide_condition:
            self.fields['fieldname'].widget = HiddenInput()
            # or alternately:  del self.fields['fieldname']  to remove it from the form altogether.

তারপরে আপনার দৃষ্টিতে:

form = MyModelForm(hide_condition=True)

আমি এই দৃষ্টিভঙ্গিতে মডেলফর্মটির ইন্টার্নালগুলি সংশোধন করার পক্ষে এই পদ্ধতির পছন্দ করি তবে এটি স্বাদের বিষয়।


11
কাওয়ার্গসের পরিবর্তে কেবল সহজ টিপস, kwargs.pop ('hide_condition', False) ['hide_condition']। আপনি আরগ কেসটি হ্যান্ডেল করবেন না, একই সময়ে একটি ডিফল্ট এবং ডেল হবে।
খ্রিস্টোফের 31

2
টিপটির জন্য ধন্যবাদ, ক্রিসটোফ 31। আমি আপনার পরামর্শটি দিয়ে আপডেট করেছি, কারণ এটি কোডটি আরও পরিষ্কার করে।
rych

1
এই পদ্ধতির সাহায্যে ক্ষেত্রটি সম্পূর্ণ আড়াল করা কি সম্ভব? আপনি যদি চালু করা পছন্দ class Meta: exclude = ["fieldname"]। এখানে সমস্যাটি হ'ল, মেটা-অ্যাপ্রোচটি "স্ট্যাটিক" তবে আমার গতিশীল কিছু দরকার। দেখুন stackoverflow.com/questions/20243735/...
Themerius

আপনি ক্যাব ডি ডিএফ __init __ (স্ব, আড়াল_কন্ডিশন = সত্য, * আরগস, ** কোয়ার্গস) যা সবচেয়ে পরিষ্কার উপায় ...
ভিজিয়ান স্কেলোরু

22

সাধারণ ফর্ম জন্য আপনি করতে পারেন

class MyModelForm(forms.ModelForm):
    slug = forms.CharField(widget=forms.HiddenInput())

আপনার যদি মডেল ফর্ম থাকে তবে আপনি নিম্নলিখিতটি করতে পারেন

class MyModelForm(forms.ModelForm):
    class Meta:
        model = TagStatus
        fields = ('slug', 'ext')
        widgets = {'slug': forms.HiddenInput()}

আপনি __init__পদ্ধতি ওভাররাইড করতে পারেন

class Myform(forms.Form):
    def __init__(self, *args, **kwargs):
        super(Myform, self).__init__(*args, **kwargs)
        self.fields['slug'].widget = forms.HiddenInput()

1

আপনি যদি ক্ষেত্রটি সর্বদা লুকিয়ে রাখতে চান তবে নিম্নলিখিতটি ব্যবহার করুন:

class MyForm(forms.Form):
    hidden_input = forms.CharField(widget=forms.HiddenInput(), initial="value")

0

আপনি কেবল CSS ব্যবহার করতে পারেন:

#id_fieldname, label[for="id_fieldname"] {
  position: absolute;
  display: none
}

এটি ক্ষেত্র এবং এর লেবেলটিকে অদৃশ্য করে তুলবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.