Django изменить выбор до проверки - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь обновить поле выбора, прежде чем оно будет проверено в Django. Причина этого заключается в том, что поле выбора в значении вопроса - это идентификатор модели, которую я хочу обновить.

def fuelLogSystemOne(request):
entries = FuelLogSystemOneMod.objects.all().order_by('date')
products = productsMod.objects.all()
if request.method == 'POST':
    form = forms.AddFuelLogOneForm(request.POST, request.FILES)
    productid = form['product'].value()
    product = productsMod.objects.get(id=productid)
    product_id = request.POST.get('product')
    form.fields['product'].choices = [(product.product_type, product.product_type)]
    if form.is_valid():
        bucketsRemoved = form['buckets_added'].value()
        product.stock -= bucketsRemoved
        product.save(['stock'])
        instance = form.save(commit=False)
        instance.staff = request.user
        instance.save()
        return redirect('home')
else:
    form = forms.AddFuelLogOneForm()
return render(request,'systems/fuellogsystemone.html',{'form':form,'entry':entries,'products':products})

В приведенной ниже части я пытаюсь изменить данные формы, прежде чем она будет проверена, поэтому он не говорит «Выберите правильный выбор. 1 не является одним из доступных вариантов '

    product_id = request.POST.get('product')
    form.fields['product'].choices = [(product.product_type, product.product_type)]

Но когда я впервые отправляю форму, она все еще говорит: "Выберите правильный выбор".

В какой момент Django проверяет форму, потому что я изменяю форму перед методом is_valid (), и она все еще сталкивается с этой ошибкой?

1 Ответ

2 голосов
/ 03 апреля 2020

Это должно быть в вашей форме, вы должны переопределить метод init и передать идентификатор продукта во время инициализации формы в представлениях

forms.py

class AddFuelLogOneForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        product = kwargs.pop('product', None)
        self.fields['product'].choices = [(product.product_type, product.product_type)]

views.py

def fuelLogSystemOne(request):
    entries = FuelLogSystemOneMod.objects.all().order_by('date')
    products = productsMod.objects.all()
    if request.method == 'POST':
        product_id = request.POST.get('product')
        productid = form['product'].value()
        product = productsMod.objects.get(id=productid)
        product_id = request.POST.get('product')
        form = forms.AddFuelLogOneForm(request.POST, request.FILES, product=product)
        if form.is_valid():
            bucketsRemoved = form['buckets_added'].value()
            product.stock -= bucketsRemoved
            product.save(['stock'])
            instance = form.save(commit=False)
            instance.staff = request.user
            instance.save()
            return redirect('home')
    else:
        form = forms.AddFuelLogOneForm()
    return render(request,'systems/fuellogsystemone.html',{'form':form,'entry':entries,'products':products})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...