#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)