हाय सब मेरे पास निम्न रूप को नीचे परिभाषित किया गया है। यदि यह एक ऐसा फॉर्म है जिसे fte_assignment ऑब्जेक्ट पास किया जा रहा है और यदि यह None नहीं है तो मैं उपयोगकर्ता फ़ील्ड को अक्षम करना चाहता हूं जो काम कर रहा है। समस्या यह है कि जब मैं फॉर्म जमा करता हूं तो मुझे निम्न फ़ील्ड त्रुटि मिलती है Select a valid choice. That choice is not one of the available choices. मैं सोच रहा हूं कि मैं क्या बदल सकता हूं ताकि फ़ील्ड अभी भी अक्षम हो, सत्यापन पास हो जाएगा? नीचे मैं आवश्यक प्रपत्र परिभाषा जानकारी और दृश्य से कॉल शामिल करता हूं।

forms.py

class TeacherForm(forms.Form):
    def __init__(self, *args, **kwargs):
        self.location = kwargs.pop('location', None)
        self.end_year = kwargs.pop('end_year', None)
        # fte_assignment gets passed in if it is an edit this helps
        # with when to fire off our clean method logic
        self.fte_assignment = kwargs.pop('fte_assignment', None)
        super(TeacherForm, self).__init__(*args, **kwargs)

        # THIS IS WHERE I DISABLE THE FORM
        if self.fte_assignment:
            self.fields['user'].disabled = True

    user = forms.ModelChoiceField(
        label='Employee',
        queryset=User.objects.all()
    )
    room = forms.CharField(max_length=6)
    extension = forms.IntegerField()
    job = forms.ModelChoiceField(
        queryset=Job.objects.all()
    )

views.py

fte_assignment = FTEFutureAssignment.objects.get(pk=fte_id)
form_kwargs = {
    'user': fte_assignment.user,
    'room': fte_assignment.room,
    'extension': fte_assignment.extension,
    'job': fte_assignment.job
}
form = TeacherForm(
    request.POST or None,
    initial=form_kwargs,
    location=location,
    end_year=end_year,
    fte_assignment=fte_assignment
)

teacher_form.html

    <form
        method="post"
        novalidate
        action="
            {% if not fte_assignment %}
                {% url 'position_control:teacher_form_add' location_id tab %}
            {% else %}
                {% url 'position_control:teacher_form_edit' location_id fte_assignment.id %}
            {% endif %}
        ">
        {% csrf_token %}
        <div class="form-row">
            <div class="form-group col-4">
                {{ form.errors.user }}
                <label for="">{{ form.user.label }}</label>
                {{ form.user }}
            </div>
            <div class="form-group col-2">
                {{ form.errors.room }}
                <label for="">{{ form.room.label }}</label>
                {{ form.room }}
            </div>
            <div class="form-group col-2">
                {{ form.errors.extension }}
                <label for="">{{ form.extension.label }}</label>
                {{ form.extension }}
            </div>
            <div class="form-group col-4">
                {{ form.errors.job }}
                <label for="">{{ form.job.label }}</label>
                {{ form.job }}
            </div>
        </div>
        <div class="form-row">
            <div class="form-group col">
                <button type="submit" class="btn ok">Submit</button>
            </div>
        </div>
        <a href="{% url 'position_control:teacher_list' location_id %}"><i class="far fa-arrow-circle-left"></i> Return to Teacher List</a>
    </form>
0
jsm1th 27 मार्च 2018, 16:32

2 जवाब

समाधान के इर्द-गिर्द अपनी तरह का काम छोड़ना चाहता हूं, मैं मूल प्रश्न के साथ आया हूं, अगर यह भविष्य में किसी की मदद करेगा। टेम्पलेट में यदि यह एक संपादन है तो मैंने फॉर्म को उपयोगकर्ता फ़ील्ड के मान को प्रस्तुत किया है, न कि वास्तविक फ़ील्ड को।

{% if not form.initial %}
    {{ form.errors.user }}
    <label for="">{{ form.user.label }}</label>
    {{ form.user }}
{% else %}
    <label for="">{{ form.user.label }}</label>
    <p>{{ form.initial.user.last_name }}, {{  form.initial.user.first_name }}</p>
{% endif %}

फिर forms.py में मैंने परिभाषित करने के लिए उपयोगकर्ता फ़ील्ड में परिवर्तन किया:

user = forms.ModelChoiceField(
    label='Employee',
    required=False,
    queryset=User.objects.all()
)

और फिर मैं मैन्युअल रूप से उपयोगकर्ता फ़ील्ड की सफाई करता हूं। मैंने नीचे इसका कारण यह बताया कि यदि यह एक संपादन है और fte_assignment की एक निश्चित विशेषता है (व्यावसायिक आवश्यकता जो मुझे नहीं मिलेगी) मान कभी नहीं बदलता है इसलिए मैं इसे यहां ऑब्जेक्ट से वापस कर देता हूं।

 def clean_user(self):
    user = self.cleaned_data.get('user', None)

    # If it is an edit check to see if fte_assingment has assignment so
    # we know we are editing a current year object. If it is current
    # year object just return the user from this method so that it
    # gets set in the request.POST and is valid. This is done because
    # in current year users cannot be edited.
    if self.fte_assignment:
        if hasattr(self.fte_assignment, 'assignment'):
            return self.fte_assignment.assignment.user

    # Manually handle user validation
    if not user:
        raise forms.ValidationError('This field is required.')
    return user

मुझे यकीन नहीं है कि यह समाधान कितना साफ है, लेकिन यह मेरे लिए काम करता है और जाहिर है कि किसी भी आलोचना का स्वागत है।

0
jsm1th 27 मार्च 2018, 23:19

आपको उपयोगकर्ता MultiChoiceField में आवश्यक = गलत जोड़ना होगा।

user = forms.ModelChoiceField(
    label='Employee',
    required=False,
    queryset=User.objects.all()

इसका मतलब है कि self.fte_assignment के लिए आवश्यक कोई चयन नहीं है नहीं कोई मामला नहीं। आपने उपयोगकर्ता फ़ील्ड को अक्षम कर दिया है लेकिन इसे फॉर्म स्तर में रिक्त सत्य के रूप में सेट नहीं किया है।

0
ramganesh 27 मार्च 2018, 13:49