Невозможно передать атрибуты формы в ModelForm в шаблон
Я пытаюсь установить ModelForm, но когда я не получаю attrs, которые я установил в моей форме в Template.
Также я хочу получить ввод даты в формате dd/mm/yyyy,
.
Вот моя модель:
class Delivery(models.Model):
user = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name=_("delivery_user"))
full_name_reciever = models.CharField(_("Reciever Full Name"), max_length=50)
pickup_address = models.ForeignKey(Address, on_delete=models.CASCADE, related_name=_("pickup_address"))
destination_address = models.CharField(max_length=250)
destination_city = models.ForeignKey(City, on_delete=models.CASCADE, related_name=_("delivery_city"))
destination_post_code = models.CharField(max_length=20)
operation_date = models.DateField(
_("desired pickup date"), auto_now=False, auto_now_add=False, blank=False, null=False
)
boxes_number = models.PositiveIntegerField(_("Number of Boxes"), default=1)
boxes_wight = models.PositiveIntegerField(_("Boxes Wight"), default=1)
boxes_volume = models.PositiveIntegerField(_("Boxes Volume"), default=0)
document = models.FileField(
help_text=_("Delivery Documets"),
verbose_name=_("Delivery Certificates"),
upload_to="documents/deliveries_documents/",
)
invoice = models.BooleanField(_("check if you want an invoice"), default=False)
created_at = models.DateTimeField(_("Created at"), auto_now_add=True, editable=False)
updated_at = models.DateTimeField(_("Updated at"), auto_now=True)
delivery_key = models.CharField(max_length=200)
billing_status = models.BooleanField(default=False)
delivery_status = models.BooleanField(default=False)
class Meta:
ordering = ("-created_at",)
verbose_name = _("Delivery")
verbose_name_plural = _("Deliveries")
def __str__(self):
return str(self.created_at)
Форма Модель:
class UserDeliveryForm(forms.ModelForm):
class Meta:
model = Delivery
fields = [
"full_name_reciever",
"pickup_address",
"destination_address",
"destination_city",
"destination_post_code",
"operation_date",
"boxes_number",
"boxes_wight",
"boxes_volume",
"document",
"invoice",
"delivery_key",
"billing_status",
"delivery_status",
]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["full_name_reciever"].widget.attrs.update(
{"class": "form-control mb-2 delivery-form", "Placeholder": "full name reciever "}
)
self.fields["pickup_address"].widget.attrs.update(
{"class": "form-control mb-2 delivery-form", "Placeholder": "pickup address "}
)
self.fields["destination_address"].widget.attrs.update(
{"class": "form-control mb-2 delivery-form", "Placeholder": "destination address"}
)
self.fields["destination_city"].widget.attrs.update(
{"class": "form-control mb-2 delivery-form", "Placeholder": "destination city"}
)
self.fields["destination_post_code"].widget.attrs.update(
{"class": "form-control mb-2 delivery-form", "Placeholder": "Post Code"}
)
self.fields["operation_date"].widget.attrs.update(
{"class": "form-control mb-2 delivery-form", "Placeholder": "operation date"}
)
self.fields["boxes_number"].widget.attrs.update(
{"class": "form-control mb-2 delivery-form", "Placeholder": "boxes number"}
)
self.fields["boxes_wight"].widget.attrs.update(
{"class": "form-control mb-2 delivery-form", "Placeholder": "boxes wight"}
)
self.fields["boxes_volume"].widget.attrs.update(
{"class": "form-control mb-2 delivery-form", "Placeholder": "boxes volume"}
)
self.fields["document"].widget.attrs.update(
{"multiple": True, "class": "form-control mb-2 delivery-form", "Placeholder": "document"}
)
self.fields["invoice"].widget.attrs.update(
{"class": "form-control mb-2 delivery-form", "Placeholder": "invoice"}
)
self.fields["delivery_key"].widget.attrs.update(
{"class": "form-control mb-2 delivery-form", "Placeholder": "delivery key"}
)
self.fields["billing_status"].widget.attrs.update(
{"class": "form-control mb-2 delivery-form", "Placeholder": "billing status"}
)
self.fields["delivery_status"].widget.attrs.update(
{"class": "form-control mb-2 delivery-form", "Placeholder": "delivery status"}
)
И мой взгляд:
class DeliveryCreateView(LoginRequiredMixin, UserPassesTestMixin, CreateView):
model = Delivery
fields = [
"full_name_reciever",
"pickup_address",
"destination_address",
"destination_city",
"destination_post_code",
"operation_date",
"boxes_number",
"boxes_wight",
"boxes_volume",
"document",
"invoice",
"delivery_key",
"billing_status",
"delivery_status",
]
template_name = "deliveries/customer/edit_deliveries.html"
success_url = reverse_lazy("account:dashboard")
def test_func(self):
return self.request.user.is_customer and self.request.user.is_active
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
files = request.FILES.getlist("decument")
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
form.instance.user_id = self.request.user.id
return super().form_valid(form)
Я хочу получить в своем шаблоне пикет даты, используя формат даты dd/mm/yyyy, но когда я указываю тип ввода вручную на "дата" в шаблоне, я получаю формат mm/dd/yyyy с пикером даты.
Вот шаблон , который я использую:
Also even though I set the form to accept multiple file upload, I need to manually set that in my template. also the css class='form-control' that don't work from widgets setting in the form.
Я устранил проблему, я понял, что я не назначил Mofelform контекстным данным Modelview.
.
Это ModelView:
class DeliveryCreateView(LoginRequiredMixin, UserPassesTestMixin, CreateView):
model = Delivery
form_class = UserDeliveryForm
template_name = "deliveries/customer/edit_deliveries.html"
success_url = reverse_lazy("account:dashboard")
def test_func(self):
return self.request.user.is_customer and self.request.user.is_active
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
files = request.FILES.getlist("decument")
if form.is_valid():
for f in files:
f.save()
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
form.instance.user_id = self.request.user.id
return super().form_valid(form)
вы можете использовать плавный код в классе ModelForm :
operation_date = forms.DateField(widget=forms.DateInput(
attrs={"type": 'date', 'required': False, 'value': datetime.datetime.today().strftime('%Y-%d-%m')}), label=_("Date"))