Не удается передать attrs формы в форме модели в шаблон

#html #css #django #django-forms #django-templates

Вопрос:

Я пытаюсь установить форму модели, но я не получаю attrs, которые я задал в своей форме в шаблоне.
Кроме того, я хочу получить ввод даты в формате дд/мм/гггг,
это моя модель:

 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"}
        )
 

And my view:

 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)
 

Я хочу получить пикет даты в своем шаблоне, используя формат даты дд/мм/гггг, но когда я вручную указываю тип ввода «дата» в шаблоне, я получаю формат мм/дд/гггг с помощью средства выбора даты.
Это шаблон, который я использую:

 {% extends "../../account/sub_base.html" %}
{% load l10n %}
{% block title %}Edit Delivery{% endblock %}

{% block sub_content %}
<div class=" col-lg-10 mx-auto">
  <h1 class="h3">Create/Edit Delivery</h1>
  <div>Add a new <b>Delivery</b> </div>
  <hr />
  <form name="delivery_form" class="delivery-form" method="post" enctype="multipart/form-data">
    {% if form.errors %}
    {{form.errors}}
    <div class="alert alert-primary" role="alert">
      Error: Please try again!
    </div>
    {% endif %}
    {% csrf_token %}
    <div class="form-group">
      <label class="small fw-bold">{{ form.full_name_reciever.label}}</label>
      {{ form.full_name_reciever }}
    </div>

    <div class="form-group">
      <label class="small fw-bold">{{ form.pickup_address.label}}</label>
      {{form.pickup_address }} 
    </div> 
      <div class="form-group">
        <label class="small fw-bold">{{ form.destination_address.label}}</label>
        {{ form.destination_address }}</div>

    <div class="form-group">
      <label class="small fw-bold">{{ form.destination_city.label}}</label>
     {{ form.destination_city }}</div>
     
      <div>
        <label class="small fw-bold">{{ form.destination_post_code.label}}</label>
        {{ form.destination_post_code }} 
      </div> 
      {% localize on %}
      <div class="form-group">
        <label class="small fw-bold">{{ form.operation_date.label}}</label>
        {{ form.operation_date }} 
      </div> 
      {% endlocalize %} 
      <div>
        <label class="small fw-bold">{{ form.boxes_number.label}}</label>
        {{ form.boxes_number }}
      </div>
      <div>
        <label class="small fw-bold">{{ form.boxes_wight.label}}</label>
        {{ form.boxes_wight }}
      </div>
      <div>
        <label class="small fw-bold">{{ form.boxes_volume.label}}</label>
        {{ form.boxes_volume }}
      </div>
      <div>
        <label class="small fw-bold">{{ form.document.label}}</label>
        <input type="file" multiple value={{ form.document }}> 
      </div>
      <div class="form-group form-check">
        <label class="small fw-bold">{{ form.invoice.label}}</label>
        {{ form.invoice }} 
      </div>
      <div>
        <label class="small fw-bold">{{ form.delivery_key.label}}</label>
        {{ form.delivery_key }}
    </div>

    <div class="form-group form-check">
      <label class="small fw-bold">{{ form.delivery_status.label}}</label>
      <input type="checkbox" class="form-check-input" value={{ form.delivery_status }} </div> 
    <button class="btn btn-primary btn-block py-2 mb-4 mt-4 fw-bold w-100" type="button" value="Submit"
        onclick="submitForm()">
      Add Delivery
      </button>
  </form>

</div>

<script>
  function submitForm() {
    var form = document.getElementsByName('delivery_form')[0];
    form.submit(); // Submit the form
    form.reset(); // Reset all form data
    return false; // Prevent page refresh
  }
</script>
{% endblock %}
 

Кроме того, несмотря на то, что я настроил форму для приема загрузки нескольких файлов, мне нужно вручную установить это в своем шаблоне. также класс css=»управление формой», который не работает с настройками виджетов в форме.
отображение формы

Ответ №1:

вы можете использовать текущий код в классе ModelForm :

 operation_date = forms.DateField(widget=forms.DateInput(
    attrs={"type": 'date', 'required': False, 'value': datetime.datetime.today().strftime('%Y-%d-%m')}), label=_("Date"))
 

Ответ №2:

Я исправил проблему, я выяснил, что я не назначил 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)
 

Вот какой результат я получаю:
форма