Как обновить значения фейлов формы на основе условия в django

Давайте рассмотрим номер моей партии 145789, если пользователь является администратором, обновите номер партии, а если пользователь не является администратором, он должен быть доступен для чтения

Рассмотрим мой файл forms.py как

class JobItemHorticlutureUpdateForm(BetterModelForm):
    image = forms.ImageField(label=('Image'),required=False, error_messages = {'invalid':("Image files only")}, widget=forms.FileInput)
    def __init__(self, *args, **kwargs):
        super(JobItemHorticlutureUpdateForm, self).__init__(*args, **kwargs)
        client = kwargs.get("initial", {}).get("client")
        user = kwargs.get("initial",{}).get("user")
        if not user.is_admin:
            
            self.fields["batch_number"].widget.attrs['readonly'] = True
        self.fields['quantity'].required = False
        self.fields['height'].required = False
        self.fields['girth'].required = False
    def clean_quantity(self):
        instance = getattr(self, 'instance', None)
        if instance and instance.pk:
            return instance.quantity
        else:
            return self.cleaned_data['quantity']

    class Meta:
        model = JobItems
        exclude = ('created_by', 'client', 'is_deleted', 'is_checked', 'status')
        widgets = {
            "supplier_one": forms.TextInput,
            "supplier_two": forms.TextInput,
            "supplier_three": forms.TextInput,
            "supplier_four": forms.TextInput,
            "supplier_five": forms.TextInput,
            "supplier_six": forms.TextInput,
            "item_file":forms.FileInput,
        }
        fieldsets = [
            ["main", {
                "fields": ['item_name', 'common_name','batch_number'],
                 "legend": "Main details",
            }],
            ["extra", {
                "fields": ['girth','height', 'quantity'],
                "legend": "Additional details",
            }],
        ]

рассмотрим мой файл views.py как

class JobItemUpdateView(CustomAuthMixin, UpdateView):
    model = JobItems
    form_class = JobItemHorticlutureUpdateForm
    context_object_name = "items"
    template_name = "jobs/jobitem_form.django.html"

    def get_initial(self):
        self.client = self.request.user.client
        self.user = self.request.user
        get_params = self.request.GET.copy()
        pricelist = get_params.pop('price_list', [0])[0]
        
        initial = super(JobItemUpdateView, self).get_initial()
        initial['client'] = self.request.user.client
        initial['created_by'] = self.request.user
        initial['user'] = self.request.user
        return initial
    def get_queryset(self):
        client = self.request.user.client
        return self.model.objects.filter(client_id=client).exclude(is_deleted=True)

    def get_context_data(self, **kwargs):
        context = super(JobItemUpdateView, self).get_context_data(**kwargs)

        context["is_update_view"] = True
        
        context["pricelists"] = self.client.pricelist_set.all()

        return context
        
   def form_valid(self, form):
        supplier_one = form.cleaned_data.get('add_supplier_one')
        bom = form.cleaned_data.get('bom')
        object_copy = copy.copy(self.object)
        object_copy.refresh_from_db()
        with transaction.atomic():
           self.object = form.save(commit=False)
           self.object.supplier_one_id = supplier_one
           self.object.batch_number = self.object.batch_number
           self.object.save()

        messages.success(self.request, 'Item Successfully Edited.')
        return redirect(self.get_success_url())

    def get_success_url(self):
        return reverse_lazy("item list")

вот мой models.py

class JobItems(models.Model):
    item_name = models.CharField(max_length=512)
    quantity = models.DecimalField(
                    max_digits=10, decimal_places=2, default=0.00,
                    verbose_name='Quantity In Stock')
    supplier_one = models.ForeignKey("core.Supplier", null=True, blank=True, related_name='supplier_one')
    height = models.CharField(max_length=200, blank=True, null=True, help_text="(In cm's)")
    girth = models.CharField(max_length=200, blank=True, null=True, help_text="(In cm's)")
    batch_number = models.CharField(max_length=200, blank=True, null=True)
    ....
    ....
    ....

Теперь в моих формах, если пользователь не является администратором, мы делаем readonly, а если пользователь является администратором, мы позволяем редактировать, но значение обновления не обновляется в базе данных

В настоящее время мой batch_number от 145789 до 145777 только если пользователь является admin

Вернуться на верх