জাজানো ডিফল্ট ফর্ম মান সেট করে


241

নীচে আমার একটি মডেল রয়েছে:

class TankJournal(models.Model):
    user = models.ForeignKey(User)
    tank = models.ForeignKey(TankProfile)
    ts = models.IntegerField(max_length=15)
    title = models.CharField(max_length=50)
    body = models.TextField()

উপরোক্ত মডেলটির জন্য আমার কাছে একটি মডেল ফর্মও রয়েছে:

class JournalForm(ModelForm):
    tank = forms.IntegerField(widget=forms.HiddenInput()) 

    class Meta:
        model = TankJournal
        exclude = ('user','ts')

আমি কীভাবে সেই ট্যাঙ্কের গোপন ক্ষেত্রের জন্য ডিফল্ট মান সেট করতে পারি তা জানতে চাই। এখন পর্যন্ত ফর্মটি প্রদর্শন / সংরক্ষণ করার জন্য আমার ফাংশনটি এখানে:

def addJournal(request, id=0):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/')

    # checking if they own the tank
    from django.contrib.auth.models import User
    user = User.objects.get(pk=request.session['id'])

    if request.method == 'POST':
        form = JournalForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)

            # setting the user and ts
            from time import time
            obj.ts = int(time())
            obj.user = user

            obj.tank = TankProfile.objects.get(pk=form.cleaned_data['tank_id'])

            # saving the test
            obj.save()

    else:
        form = JournalForm()

    try:
        tank = TankProfile.objects.get(user=user, id=id)
    except TankProfile.DoesNotExist:
        return HttpResponseRedirect('/error/')

উত্তর:


401

আপনি প্রাথমিক ব্যবহার করতে পারেন যা এখানে ব্যাখ্যা করা হয়েছে

ফর্ম কনস্ট্রাক্টরকে কল করার সময় আপনার কাছে দুটি বিকল্প রয়েছে have

form = JournalForm(initial={'tank': 123})

অথবা ফর্ম সংজ্ঞায় মান নির্ধারণ করুন:

tank = forms.IntegerField(widget=forms.HiddenInput(), initial=123) 

এবং সেই পরিবর্তনশীলটি কীভাবে initialআসল রূপে চলে যায়? প্রকৃত ফর্মের মডেলটিতে, আমাদের কী পরামিতি / যুক্তি হিসাবে লিখতে হবে?
এমজিপিপি

2
@ ভারাল এটি যাদু। ;-) (অথবা বরং, জ্যাঙ্গো ফর্ম নির্মাতারা বিশেষ "প্রাথমিক" পরিবর্তনশীল বুঝতে পারেন এবং আপনাকে অতিরিক্ত কিছু করার প্রয়োজন ছাড়াই এর বিষয়বস্তুগুলির মাধ্যমে পুনরাবৃত্তি করতে পারেন)। ব্যক্তিগতভাবে, আমি ফর্ম সংজ্ঞায় ডিফল্ট মান নির্দিষ্ট করতে পছন্দ করি এবং কেবলমাত্র প্রাথমিক = ... প্রক্রিয়াটি ব্যবহার করতে চাইলে পছন্দসই ডিফল্টটি একটি গতিশীল মান হয় (যেমন কোনও ব্যবহারকারীর দ্বারা প্রবেশ করা কিছু, বা তাদের লগ-ইন, ভৌগলিক অবস্থান ইত্যাদির উপর ভিত্তি করে))
রিচার্ড জে ফস্টার

66
প্রাথমিকটি ডিফল্ট নয়। ফর্মটি বেঁধে দেওয়া থাকলে প্রাথমিক মানটি প্রযোজ্য না :(।
ক্লাইমে

4
আর একটি ইউসকেস উল্লেখ করার জন্য এখানে মন্তব্য করা যেখানে প্রাথমিক প্যারামের এই সমাধানটি সহায়তা করবে: আপনি যদি নিবন্ধের ফর্মের ইমেল / আইডি বা অন্য কোনও শংসাপত্রের প্রিপোপুলেট করতে চান তবে সেই ক্ষেত্রে আপনি এটি লিখতে পারবেন না মডেলটি নিজেই এটিটিকে গতিশীল বলে বরং @ umnik700 দ্বারা উল্লিখিত হিসাবে আপনাকে প্রাথমিক প্যারাম দিয়ে কনস্ট্রাক্টরকে কল করতে হবে । দুর্দান্ত কাজ!
কেশব অগ্রওয়াল

1
@ ফিলিপ: View.get_formপ্রাথমিক ডেটা সেট করতে ওভাররাইড করবেন না । একটি ফর্মমিক্সিন সহ যে কোনও সিবিভি (মূলত সমস্ত সিবিভি যা ডেটা তৈরি করে বা সম্পাদনা করে) হয় শ্রেণি-স্তরের initialভেরিয়েবল ব্যবহার করতে পারে (অপরিবর্তিত ডিফল্টগুলির জন্য) অথবা আপনি FormMixin.get_initial()ফর্মের কনস্ট্রাক্টরে পাস করার জন্য প্রাথমিক মানের একটি ডিক ফেরত দিতে অগ্রাহ্য করতে পারেন (গতিশীল ডিফল্টের জন্য) ।)
GDorn


15

আপনি যদি POST মানগুলি থেকে প্রাথমিকভাবে মডেলফর্ম তৈরি করে থাকেন তবে এই উপায়টি বরাদ্দ করা যেতে পারে:

form = SomeModelForm(request.POST, initial={"option": "10"})

https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#providing-initial-values


6
সেই or Noneঅংশটির সত্যই প্রয়োজন নেই।
স্মিডো

11

আমার এই অন্যান্য সমাধান ছিল (আমি অন্য কেউ যেমন মডেল থেকে নিম্নলিখিত পদ্ধতিটি ব্যবহার করছি সে ক্ষেত্রে এটি পোস্ট করছি):

class onlyUserIsActiveField(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(onlyUserIsActiveField, self).__init__(*args, **kwargs)
        self.fields['is_active'].initial = False

    class Meta:
        model = User
        fields = ['is_active']
        labels = {'is_active': 'Is Active'}
        widgets = {
            'is_active': forms.CheckboxInput( attrs={
                            'class':          'form-control bootstrap-switch',
                            'data-size':      'mini',
                            'data-on-color':  'success',
                            'data-on-text':   'Active',
                            'data-off-color': 'danger',
                            'data-off-text':  'Inactive',
                            'name':           'is_active',

            })
        }

প্রাথমিক __init__হিসাবে ফাংশন definded হয়self.fields['is_active'].initial = False


0

আমি আশা করি এটা তোমাকে সাহায্য করবে:

form.instance.updatedby = form.cleaned_data['updatedby'] = request.user.id

0

জাজানো ডক্সে যেমন ব্যাখ্যা করা হয়েছে , initialতেমন নয় default

  • প্রাথমিক একটি ক্ষেত্র মান একটি HTML প্রদর্শন করা উদ্দেশ্যে। তবে ব্যবহারকারী যদি এই মানটি মুছে ফেলে এবং শেষ পর্যন্ত এই ক্ষেত্রটির জন্য একটি ফাঁকা মান ফেরত পাঠায়, initialমানটি হারাবে। সুতরাং আপনি কোনও ডিফল্ট আচরণ দ্বারা প্রত্যাশিত যা অর্জন করেন না ।

  • ডিফল্ট আচরণ: যদি মান বৈধতা প্রক্রিয়া নিতে হবে dataযুক্তি ক্ষেত্রের জন্য কোনো মান থাকে না।

এটি বাস্তবায়নের জন্য, একটি সহজ উপায় হ'ল একত্রিত করা initialএবং clean_<field>():

class JournalForm(ModelForm):
    tank = forms.IntegerField(widget=forms.HiddenInput(), initial=123) 

    (...)

    def clean_tank(self):
        if not self['tank'].html_name in self.data:
            return self.fields['tank'].initial
        return self.cleaned_data['tank']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.