একটি গতিশীল পছন্দ ক্ষেত্র তৈরি করা হচ্ছে


136

জাঙ্গোতে কীভাবে গতিশীল পছন্দ ক্ষেত্র তৈরি করতে হয় তা বোঝার চেষ্টা করতে আমার কিছুটা সমস্যা হচ্ছে। আমার কাছে এমন একটি মডেল সেট আপ করা আছে:

class rider(models.Model):
     user = models.ForeignKey(User)
     waypoint = models.ManyToManyField(Waypoint)

class Waypoint(models.Model):
     lat = models.FloatField()
     lng = models.FloatField()

আমি যা করার চেষ্টা করছি তা হ'ল একটি পছন্দ ক্ষেত্র তৈরি করুন যার মানগুলি সেই রাইডারের সাথে যুক্ত উপায়গুলি (যা লগ ইন করা ব্যক্তি হবে)।

বর্তমানে আমি আমার ফর্মগুলিতে এই জাতীয়টিকে ওভাররাইড করছি:

class waypointForm(forms.Form):
     def __init__(self, *args, **kwargs):
          super(joinTripForm, self).__init__(*args, **kwargs)
          self.fields['waypoints'] = forms.ChoiceField(choices=[ (o.id, str(o)) for o in Waypoint.objects.all()])

তবে যা কিছু করা যায় তা সমস্ত উপায়ের তালিকা রয়েছে, তারা কোনও নির্দিষ্ট রাইডারের সাথে সম্পর্কিত নয়। কোন ধারনা? ধন্যবাদ।

উত্তর:


191

আপনি ফর্ম ইমেতে ব্যবহারকারীকে পাস করার মাধ্যমে পয়েন্টগুলি ফিল্টার করতে পারেন

class waypointForm(forms.Form):
    def __init__(self, user, *args, **kwargs):
        super(waypointForm, self).__init__(*args, **kwargs)
        self.fields['waypoints'] = forms.ChoiceField(
            choices=[(o.id, str(o)) for o in Waypoint.objects.filter(user=user)]
        )

আপনার ভিউ থেকে ফর্মটি শুরু করার সময় ব্যবহারকারীর পাস করুন pass

form = waypointForm(user)

মডেল ফর্ম ক্ষেত্রে

class waypointForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        super(waypointForm, self).__init__(*args, **kwargs)
        self.fields['waypoints'] = forms.ModelChoiceField(
            queryset=Waypoint.objects.filter(user=user)
        )

    class Meta:
        model = Waypoint

20
মডেলফর্ম কিনা তা মডেলচয়েসফিল্ড ব্যবহার করুন - এটি সাধারণ ফর্মগুলিতেও কাজ করে।
ড্যানিয়েল রোজম্যান

9
আপনি অনুরোধের তথ্যটি বাইরে বের করতে চাইলে আপনি কী করবেন? ওয়েপয়েন্টফর্ম (অনুরোধ.পষ্ট) প্রথমটিতে বৈধতা পাবে না, কারণ এর বিরুদ্ধে বৈধতা দেওয়ার জন্য ডেটা আর নেই।
ব্রিডলি

1
@ আশোক কীভাবে এই দৃষ্টান্তে চেকবক্সসিলিট মাল্টিপল উইজেট ব্যবহার করা যেতে পারে? বিশেষ করে মডেলফর্মের জন্য।
wasabigeek

2
আপনি যদি CheckboxSelectMultipleএটির সাথে উইজেটটি ব্যবহার করতে চান তবে আপনি MultipleChoiceFieldবা ব্যবহার করতে চাইবেন ModelMultipleChoiceField। প্রথমদিকে, এটির সাথে কাজ করছে বলে মনে হচ্ছে ChoiceField, তবে ফর্মটি সংরক্ষণ করার চেষ্টা করলে অভ্যন্তরীণ অংশগুলি ভেঙে যাবে।
coredumperror

1
আপনাকে @ কোরডাম্পেরর ধন্যবাদ - আপনার মন্তব্য (দোহ!) পড়ার আগে প্রায় 2 ঘন্টা এটির জন্য লড়াই করেছিলেন এবং এটি সবশেষে কাজ করে। অন্যরা, আপনি যদি CheckboxSelectMultipleএই কোডটি দিয়ে উইজেটটি ব্যবহার করার পরিকল্পনা করেন তবে আপনার ফর্ম জমা দেওয়ার (ইউনিকোড সমস্যাগুলি) ভঙ্গ করতে সাবধান হন । ChoiceFormMultipleChoiceForm
এটিকে

11

আপনার সমস্যার অন্তর্নির্মিত সমাধান রয়েছে: মডেলচয়েসফিল্ড

সাধারণত, ModelFormযখন আপনার ডাটাবেস অবজেক্টগুলি তৈরি / পরিবর্তন করা প্রয়োজন তখন সর্বদা এটি ব্যবহার করার চেষ্টা করা উপযুক্ত । 95% ক্ষেত্রে কাজ করে এবং এটি আপনার নিজস্ব বাস্তবায়ন তৈরির চেয়ে অনেক বেশি পরিষ্কার।


8

সমস্যাটি যখন আপনি করেন

def __init__(self, user, *args, **kwargs):
    super(waypointForm, self).__init__(*args, **kwargs)
    self.fields['waypoints'] = forms.ChoiceField(choices=[ (o.id, str(o)) for o in Waypoint.objects.filter(user=user)])

একটি আপডেট অনুরোধে, পূর্ববর্তী মানটি হারাবে!


3

রাইডার দৃষ্টান্তটি সূচনা করার সময় ফর্মে যাওয়ার বিষয়ে কীভাবে?

class WaypointForm(forms.Form):
    def __init__(self, rider, *args, **kwargs):
      super(joinTripForm, self).__init__(*args, **kwargs)
      qs = rider.Waypoint_set.all()
      self.fields['waypoints'] = forms.ChoiceField(choices=[(o.id, str(o)) for o in qs])

# In view:
rider = request.user
form = WaypointForm(rider) 

2

সাধারণ পছন্দ ক্ষেত্র সহ সমাধানের নীচে। আমার সমস্যাটি ছিল প্রতিটি ব্যবহারকারীর কয়েকটি শর্তের ভিত্তিতে নিজস্ব নিজস্ব কাস্টমফিল্ড বিকল্প রয়েছে।

class SupportForm(BaseForm):

    affiliated = ChoiceField(required=False, label='Fieldname', choices=[], widget=Select(attrs={'onchange': 'sysAdminCheck();'}))

    def __init__(self, *args, **kwargs):

        self.request = kwargs.pop('request', None)
        grid_id = get_user_from_request(self.request)
        for l in get_all_choices().filter(user=user_id):
            admin = 'y' if l in self.core else 'n'
            choice = (('%s_%s' % (l.name, admin)), ('%s' % l.name))
            self.affiliated_choices.append(choice)
        super(SupportForm, self).__init__(*args, **kwargs)
        self.fields['affiliated'].choices = self.affiliated_choice

ঠিক আমি খুঁজছেন ছিল কি! ধন্যবাদ!
র‌্যাপটার

এটি আমার জীবনকে আরও সহজ করে তুলেছে .. অনেক অনেক ধন্যবাদ .. :)
অরবিন্দ আর পিল্লাই

1

ব্রিডলি এবং লিয়াং দ্বারা নির্দেশিত হিসাবে, অশোকের সমাধান ফর্ম পোস্ট করার সময় আপনাকে নির্বাচিত মান পেতে বাধা দেবে।

কিছুটা আলাদা, তবে এখনও অসম্পূর্ণ, এর সমাধানের উপায় হ'ল:

class waypointForm(forms.Form):
    def __init__(self, user, *args, **kwargs):
        self.base_fields['waypoints'].choices = self._do_the_choicy_thing()
        super(waypointForm, self).__init__(*args, **kwargs)

যদিও এটি কিছু সংগত সমস্যা তৈরি করতে পারে।


1

আপনি ক্ষেত্রটিকে আপনার ফর্মের প্রথম শ্রেণির বৈশিষ্ট্য হিসাবে ঘোষণা করতে পারেন এবং কেবল পছন্দগুলি গতিশীলভাবে সেট করতে পারেন:

class WaypointForm(forms.Form):
    waypoints = forms.ChoiceField(choices=[])

    def __init__(self, user, *args, **kwargs):
        super().__init__(*args, **kwargs)
        waypoint_choices = [(o.id, str(o)) for o in Waypoint.objects.filter(user=user)]
        self.fields['waypoints'].choices = waypoint_choices

আপনি একটি মডেলচয়েসফিল্ডও ব্যবহার করতে পারেন এবং অনুরূপ পদ্ধতিতে ডিভাইসটিতে ক্যোরিসেট সেট করতে পারেন।


0

জ্যাঙ্গো অ্যাডমিনে আপনার যদি গতিশীল পছন্দ ক্ষেত্রের প্রয়োজন হয়; এটি জাঙ্গো> = 2.1 এর জন্য কাজ করে।

class CarAdminForm(forms.ModelForm):
    class Meta:
        model = Car

    def __init__(self, *args, **kwargs):
        super(CarForm, self).__init__(*args, **kwargs)

        # Now you can make it dynamic.
        choices = (
            ('audi', 'Audi'),
            ('tesla', 'Tesla')
        )

        self.fields.get('car_field').choices = choices

    car_field = forms.ChoiceField(choices=[])

@admin.register(Car)
class CarAdmin(admin.ModelAdmin):
    form = CarAdminForm

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

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