Search code examples
pythondjangomodelform

No data is sent when submitting the django form


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


Solution

  • 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)
    
        [...]