Как обновить значения фейлов формы на основе условия в 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