Django相关/链接下拉列表选择有效的选择错误

2024-09-27 20:19:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经在Django中实现了一个依赖下拉列表,但是当我尝试提交表单时,会出现以下错误“选择有效选项”。这一选择不是可用的选择之一。”

我花了一段时间在网上寻找答案,并尝试了一些,但收效甚微

根据我的理解和阅读,这是一个错误,因为我用一个无查询集呈现表单。然后我使用ajax来填充选项。即使我已经更新了下拉列表,表单验证也会将我提交的答案与一个无的查询集进行核对,从而导致错误

因此,我希望有人能帮助我更新表单提交时接受的选项

视图.py

# stage6 is where I render my view and check validation

def stage6(request):
    form_deal = DealForm(request.POST or None, prefix='inst')
    if form_deal.is_valid():
        form_deal.save()

        messages.success(request, 'Deal added successfully.')

        form_deal = DealForm()

    context = {
        'dform': form_deal,
    }

    return render(request, 'stages/stage6/stage6.html', context)


# This is used for my ajax request 

def load_offers(request):
    property_process_id = request.GET.get('propertyprocess_link')
    offers = Offer.objects.filter(propertyprocess_link=property_process_id).order_by('id')
    return render(request, 'stages/stage6/offers_dropdown_list.html', {'offers': offers}) 

forms.py

class DealForm(forms.ModelForm):
    deal_date = forms.CharField(
            label='',
            widget=forms.TextInput(attrs={'type': 'date'})
        )

    target_move_date = forms.CharField(
            label='',
            widget=forms.TextInput(attrs={'type': 'date'})
        )

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

        # filter the foreign keys shown
        self.fields['propertyprocess_link'].queryset = PropertyProcess.objects.filter(sector="Sales")

        # filter used for ajax request
        self.fields['offer_accepted'].queryset = Offer.objects.none()

        # add a "form-control" class to each form input
        # for enabling bootstrap
        for name in self.fields.keys():
            self.fields[name].widget.attrs.update({
                'class': 'form-control',
            })

    class Meta:
        model = Deal
        fields = ('propertyprocess_link',
                  'deal_date',
                  'price_agreed',
                  'target_move_date',
                  'offer_accepted'
                  )

型号.py

class Deal(models.Model):
    propertyprocess_link = models.ForeignKey(PropertyProcess,
                                             on_delete=models.CASCADE)
    deal_date = models.DateField()
    price_agreed = models.IntegerField()
    target_move_date = models.DateField()
    offer_accepted = models.ForeignKey(Offer,
                                       on_delete=models.CASCADE)

    class Meta:
        verbose_name_plural = "deals"

    def __str__(self):
        return '%s, %s' % (
            self.propertyprocess_link.property_link.address_line_1,
            self.propertyprocess_link.property_link.postcode
        )

html

{% block content %}
<div class="container-fluid header-container">
    <div class="row">
        <div class="col-sm-9 col-md-7 col-lg-5 mx-auto">
            <div class="card-au card-signin my-5">
                <div class="card-body">
                    <form id="offers-form" data-offers-url="{% url 'ajax_load_offers' %}" class=" text-center text-white" method="post" novalidate>
                        {% csrf_token %}
                        {{ dform.non_field_errors }}
                        <div class="form-colour mt-2">
                            {{ dform.propertyprocess_link.errors }}
                            <label class="mb-0 mt-1">Property Being Offered On:</label>
                            {{ dform.propertyprocess_link }}
                        </div><div class="form-colour mt-2">
                            {{ dform.offer_accepted.errors }}
                            <label class="mb-0 mt-1">Offer Being Accepted:</label>
                            {{ dform.offer_accepted }}
                        </div>
                        <div class="form-colour mt-2">
                            {{ dform.price_agreed.errors }}
                            <label class="mb-0 mt-1">Price Agreed:</label>
                            {{ dform.price_agreed }}
                        </div>
                        <div class="form-colour mt-2">
                            {{ dform.deal_date.errors }}
                            <label class="mb-0 mt-1">Deal Date:</label>
                            {{ dform.deal_date }}
                        </div>
                        <div class="form-colour mt-2">
                            {{ dform.target_move_date.errors }}
                            <label class="mb-0 mt-1">Target Move Date:</label>
                            {{ dform.target_move_date }}
                        </div>
                        <div class="mb-3"></div>
                        {# hidden submit button to enable [enter] key #}
                        <div class="hidden-btn" style="margin-left: -9999px"><input class="hidden-btn" type="submit" value=""/></div>
                        <div class="text-center mt-2">
                            <input type="submit" class="login-btn btn-green btn btn-lg border-green text-uppercase py-3" value="Add Deal" />
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
{% endblock content %}


{% block postloadjs %}
    {{ block.super }}
        <script>
            $("#id_inst-propertyprocess_link").change(function () {
                var url = $("#offers-form").attr("data-offers-url");  // get the url of the `load_offers` view
                var propertyID = $(this).val();  // get the selected Property Process ID from the HTML input

                $.ajax({                       // initialize an AJAX request
                    url: url,                    // set the url of the request (= localhost:8000/ajax/load-offers/)
                    data: {
                    'propertyprocess_link': propertyID       // add the Property Process id to the GET parameters
                    },
                    success: function (data) {   // `data` is the return of the `load-offers` view function
                    $("#id_inst-offer_accepted").html(data);  // replace the contents of the offers input with the data that came from the server
                    }
                });

            });
        </script>
{% endblock postloadjs %}

非常感谢任何人能给予的帮助


Tags: theselfdivformdatemodelsrequestlink

热门问题