Django如何在表单set_factory中使用模型选择字段

y0u0uwnf  于 2023-01-27  发布在  Go
关注(0)|答案(1)|浏览(114)

我尝试使用formset_factory中的表单的modelchoicefield,但我不了解错误,也不知道如何解决它。
(edit添加了models.py)模型. py

class Order(Model):
    user = ForeignKey(User, on_delete=SET_NULL, null=True)
    fee = ForeignKey(Fee, on_delete=SET_NULL, null=True)
    route = ForeignKey(Route, on_delete=SET_NULL, null=True)
    price_rate = ForeignKey(PriceRate, on_delete=SET_NULL, null=True)
    pallet_amount = IntegerField()
    status = BooleanField()
    postal_code = CharField(max_length=6)
    city = CharField(max_length=255)
    street = CharField(max_length=255)
    delivery_from = DateTimeField()
    delivery_until = DateTimeField(null=True)
    created_at = DateTimeField(auto_now_add=True, blank=True)
    updated_at = DateTimeField(auto_now=True)
    deleted_at = DateTimeField(null=True, blank=True)

views.py

def routecreate_view(request):
    orderformset = formset_factory(OrdersRouteForm, can_delete=False, extra=1)
    if request.method == 'POST':
        form = RouteForm(request.POST)
        formset = orderformset(request.POST)
        if form.is_valid() and formset.is_valid():
            # process the data in form.cleaned_data as required

            messages.success(request,
                             "You succesfully created an route.")
            return HttpResponseRedirect(reverse('planner.dashboard'))
    else:
        form = RouteForm()
        formset = orderformset()
    return render(request, 'planner/route.html', {'form': form, 'formset': formset})

forms.py

class OrdersRouteForm(forms.ModelForm):
    route = ModelChoiceField(
        queryset=Order.objects.filter(status=1, delivery_until__gte=datetime.datetime.now(), deleted_at=None),
        label='Order')

    class Meta:
        model = Order
        fields = ("route",)

    def __init__(self, *args, **kwargs):
        super(OrdersRouteForm, self).__init__(*args, **kwargs)
        for visible in self.visible_fields():
            visible.field.widget.attrs['class'] = 'form-control m-2'

            self.fields['route'].label_from_instance = self.label_from_instance

    @staticmethod
    def label_from_instance(obj):
        return "pallets: %s, %s, %s, %s" % (obj.pallet_amount, obj.street, obj.city, obj.postal_code)

模板:

{% extends 'base.html' %}
{% block base %}
    <div class="container rounded bg-white mt-5 mb-5">
        <div class="row">
            <div class="col-md-5 border-right mx-auto">
                planner//route
                <div class="p-3 py-5">
                    <form id="form-container" method="POST">
                        {% csrf_token %}
                        {{ form }}
                        {{ formset }}
                        <button id="add-form" type="button">Add Another Bird</button>
                        <button class="btn btn-danger profile-button mt-3" onclick="window.history.back()">Cancel
                        </button>
                        <button class="btn btn-primary float-end mt-3" type="submit">Order</button>
                    </form>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

错误:

Cannot assign "<Order: Order object (2)>": "Order.route" must be a "Route" instance.

当我用request.POST填充表单集,然后试图将表单集发送到模板时,发生错误。
我试过inlineformset和modelformset,都没有用。任何解决方案都是受欢迎的。

omtl5h9j

omtl5h9j1#

问题似乎出在modelform上,我从代码中删除了以下内容:

class Meta:
        model = Order
        fields = ("route",)

我不明白为什么这会导致这个问题,如果有人知道并能解释,请随时这样做。
希望对其他解决这个问题的人有帮助。

相关问题