No data is sent when submitting the django form

37 Views Asked by At

I'm trying to create an Order object via ModelForm, but nothing comes out.

Forms.py

class OrderCreateForm(forms.ModelForm):
    user = forms.ModelChoiceField(queryset=get_user_model().objects.all(), widget=forms.HiddenInput())
    is_payed = forms.BooleanField(required=False, widget=forms.HiddenInput())
    status = forms.IntegerField(widget=forms.HiddenInput())
    payed_at = forms.DateTimeField(widget=forms.HiddenInput(), required=False)
    price = forms.IntegerField(widget=forms.HiddenInput(), required=False)

    class Meta:
        model = m.OrderStorage
        fields = '__all__'

Views

class StartOrder(generic.CreateView):
    template_name = 'clientpart/order_create.html'
    success_url = reverse_lazy('order_list_tire')
    form_class = f.OrderCreateForm
    queryset = m.OrderStorage.objects.all()

    def get_form(self, form_class=None):
        if form_class is None:
            form_class = self.get_form_class()
        form = form_class(**self.get_form_kwargs())
        if form.is_valid():
            size = int(str(form.cleaned_data['size']))
            period = int(str(form.cleaned_data['period']))
            price = size*period
            form.fields['price'].queryset = int(price)
        return form

    def get_form_kwargs(self,):
        ret = super().get_form_kwargs()
        print(ret)
        ret['initial'] = {
            'user': self.request.user.pk,
            'status': OrderStatus.CREATE,
        }
        return ret

According to my idea, the value is taken from the field and the price is created, then it is written to the dictionary, but for some reason it is not written to the dictionary. enter image description here

How do I record an object price

1

There are 1 best solutions below

0
1ronmat On BEST ANSWER

It seems that you are trying to set the value of the price field in your form, but you are not actually saving the form data to create a new Order object.

I think that what you need is the form_valid method where you can customize what happens when the form is submitted successfully. In this method, you can save the form data to create a new Order object, and set the price field before saving the object.

Here's an example that may can work:

class StartOrder(generic.CreateView):
    template_name = 'clientpart/order_create.html'
    success_url = reverse_lazy('order_list_tire')
    form_class = f.OrderCreateForm
    queryset = m.OrderStorage.objects.all()

    def form_valid(self, form):
        size = int(str(form.cleaned_data['size']))
        period = int(str(form.cleaned_data['period']))
        price = size * period
        form.instance.price = price
        form.instance.user = self.request.user
        form.instance.status = OrderStatus.CREATE
        return super().form_valid(form)

    [...]