Create basic order creation form
This commit is contained in:
parent
8bcc88680b
commit
fcf44c9bac
@ -9,5 +9,5 @@ class CityAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
|
|
||||||
@admin.register(Order)
|
@admin.register(Order)
|
||||||
class CityAdmin(admin.ModelAdmin):
|
class OrderAdmin(admin.ModelAdmin):
|
||||||
pass
|
pass
|
||||||
|
@ -1,52 +1,29 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
from django.core.validators import RegexValidator
|
from django.core.validators import RegexValidator
|
||||||
|
|
||||||
from .models import *
|
from .models import *
|
||||||
|
|
||||||
|
|
||||||
class BaseOrderCreationForm(forms.Form):
|
class BaseOrderCreationForm(forms.ModelForm):
|
||||||
name = forms.CharField(max_length=200, label="Название заказа", help_text='help text')
|
|
||||||
description = forms.CharField(widget=forms.Textarea, label="Описание", required=False)
|
|
||||||
|
|
||||||
square = forms.DecimalField(max_digits=7, decimal_places=2, required=True, label="Площадь в м²")
|
type_of_room = forms.ChoiceField(choices=Order.TYPE_OF_ROOM_CHOICES, required=False, label="Тип квартиры",
|
||||||
|
widget=forms.RadioSelect(attrs={"class": "inline-input"}))
|
||||||
|
is_require_design = forms.ChoiceField(choices=Order.REQUIRED_DESIGN_CHOICES, label="Требуется дизайн проект",
|
||||||
|
required=False, widget=forms.RadioSelect(attrs={"class": "inline-input"}))
|
||||||
|
purchase_of_material = forms.ChoiceField(choices=Order.PURCHASE_OF_MATERIAL_CHOICES, widget=forms.RadioSelect,
|
||||||
|
required=False, label="Закуп материала")
|
||||||
|
type_of_executor = forms.ChoiceField(choices=Order.TYPE_OF_EXECUTOR_CHOICES, widget=forms.RadioSelect,
|
||||||
|
required=False, label="Тип исполнителя")
|
||||||
|
|
||||||
type_of_renovation = forms.ChoiceField(choices=Order.TYPE_OF_RENOVATION_CHOICES, required=False,
|
class Meta:
|
||||||
label="Тип ремонта")
|
model = Order
|
||||||
|
fields = [
|
||||||
type_of_house = forms.ChoiceField(choices=Order.TYPE_OF_HOUSE_CHOICES, required=False, label="Тип дома")
|
'name', 'description', 'square',
|
||||||
|
'type_of_renovation', 'type_of_house', 'type_of_room',
|
||||||
type_of_room = forms.ChoiceField(choices=Order.TYPE_OF_ROOM_CHOICES, required=False,
|
'is_require_design', 'purchase_of_material', 'type_of_executor',
|
||||||
label="Тип квартиры", widget=forms.RadioSelect)
|
'is_with_warranty', 'is_with_contract', 'is_with_trade', 'is_with_cleaning', 'is_with_garbage_removal',
|
||||||
|
'date_start', 'date_end',
|
||||||
# требуется дизайн проект
|
'approximate_price', 'work_time', 'address_city', 'address_text',
|
||||||
is_require_design = forms.ChoiceField(choices=Order.REQUIRED_DESIGN_CHOICES, required=False,
|
]
|
||||||
label="", widget=forms.RadioSelect)
|
|
||||||
|
|
||||||
purchase_of_material = forms.ChoiceField(choices=Order.PURCHASE_OF_MATERIAL_CHOICES, required=False,
|
|
||||||
label="Закуп материала", widget=forms.RadioSelect)
|
|
||||||
|
|
||||||
type_of_executor = forms.ChoiceField(choices=Order.TYPE_OF_EXECUTOR_CHOICES, required=False,
|
|
||||||
label="Тип исполнителя", widget=forms.RadioSelect)
|
|
||||||
|
|
||||||
# дальше отдельные параметры
|
|
||||||
is_with_warranty = forms.BooleanField(label="С гарантией", initial=True, required=False)
|
|
||||||
is_with_contract = forms.BooleanField(label="Работа по договору", initial=False, required=False)
|
|
||||||
|
|
||||||
# is_with_warranty = models.BooleanField(default=True, verbose_name="С гарантией")
|
|
||||||
# is_with_contract = models.BooleanField(default=False, verbose_name="Работа по договору")
|
|
||||||
# is_with_trade = models.BooleanField(default=False, verbose_name="Возможен торг")
|
|
||||||
# is_with_cleaning = models.BooleanField(default=False, verbose_name="С уборкой")
|
|
||||||
# is_with_garbage_removal = models.BooleanField(default=False, verbose_name="С вывозом мусора")
|
|
||||||
|
|
||||||
# примерная цена
|
|
||||||
approximate_price = forms.DecimalField(max_digits=12, decimal_places=2)
|
|
||||||
|
|
||||||
work_time = forms.CharField(max_length=100, required=False)
|
|
||||||
|
|
||||||
address_city = forms.ChoiceField(choices=City.to_choices, label="Город",
|
|
||||||
help_text="если вашего города нет в списке, "
|
|
||||||
"значит сервис пока что там не работает")
|
|
||||||
address_text = forms.CharField(max_length=70, label="Улица, дом", help_text="квартиру можно не указывать")
|
|
||||||
|
|
||||||
|
|
||||||
class UnregisteredUserOrderCreationForm(BaseOrderCreationForm):
|
class UnregisteredUserOrderCreationForm(BaseOrderCreationForm):
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
|
from django.core.validators import RegexValidator
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
from account.models import SiteUser
|
from account.models import SiteUser
|
||||||
|
|
||||||
|
|
||||||
class City(models.Model):
|
class City(models.Model):
|
||||||
code = models.CharField(primary_key=True, max_length=20, verbose_name="Код города")
|
code = models.CharField(primary_key=True, max_length=20, verbose_name="Код города", validators=[
|
||||||
|
RegexValidator(regex="^[0-9a-zA-Z_]*$"),
|
||||||
|
])
|
||||||
name = models.CharField(unique=True, max_length=50, verbose_name="Название города")
|
name = models.CharField(unique=True, max_length=50, verbose_name="Название города")
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
@ -17,13 +20,13 @@ class City(models.Model):
|
|||||||
|
|
||||||
class Order(models.Model):
|
class Order(models.Model):
|
||||||
# основные поля: название и описание
|
# основные поля: название и описание
|
||||||
name = models.CharField(max_length=200)
|
name = models.CharField(max_length=200, verbose_name="Название заказа")
|
||||||
description = models.TextField(blank=True)
|
description = models.TextField(blank=True, verbose_name="Описание")
|
||||||
|
|
||||||
# площадь в квадратных метрах
|
# площадь в квадратных метрах
|
||||||
square = models.DecimalField(max_digits=5, decimal_places=2, blank=False)
|
square = models.DecimalField(max_digits=7, decimal_places=2, blank=False, verbose_name="Площадь в м²")
|
||||||
|
|
||||||
work_time = models.CharField(max_length=100, blank=True)
|
work_time = models.CharField(max_length=100, blank=True, verbose_name="Рабочее время")
|
||||||
|
|
||||||
# дальше вид дома, тип ремонта, тип квартиры, требуется дизайн проект, закуп материала, тип исполнителя
|
# дальше вид дома, тип ремонта, тип квартиры, требуется дизайн проект, закуп материала, тип исполнителя
|
||||||
|
|
||||||
@ -37,14 +40,14 @@ class Order(models.Model):
|
|||||||
TYPE_OF_RENOVATION_DESIGN = 'design'
|
TYPE_OF_RENOVATION_DESIGN = 'design'
|
||||||
|
|
||||||
TYPE_OF_RENOVATION_CHOICES = [
|
TYPE_OF_RENOVATION_CHOICES = [
|
||||||
(CHOICE_UNDEFINED, 'Не указан'),
|
|
||||||
(TYPE_OF_RENOVATION_OVERHAUL, 'Капитальный'),
|
(TYPE_OF_RENOVATION_OVERHAUL, 'Капитальный'),
|
||||||
(TYPE_OF_RENOVATION_PARTIAL, 'Частичный'),
|
(TYPE_OF_RENOVATION_PARTIAL, 'Частичный'),
|
||||||
(TYPE_OF_RENOVATION_REDECOR, 'Косметический'),
|
(TYPE_OF_RENOVATION_REDECOR, 'Косметический'),
|
||||||
(TYPE_OF_RENOVATION_PREMIUM, 'Премиальный'),
|
(TYPE_OF_RENOVATION_PREMIUM, 'Премиальный'),
|
||||||
(TYPE_OF_RENOVATION_DESIGN, 'Дизайнерский'),
|
(TYPE_OF_RENOVATION_DESIGN, 'Дизайнерский'),
|
||||||
]
|
]
|
||||||
type_of_renovation = models.CharField(max_length=10, choices=TYPE_OF_RENOVATION_CHOICES, default=CHOICE_UNDEFINED)
|
type_of_renovation = models.CharField(max_length=10, choices=TYPE_OF_RENOVATION_CHOICES, default=CHOICE_UNDEFINED,
|
||||||
|
blank=True, verbose_name="Тип ремонта")
|
||||||
|
|
||||||
# тип дома
|
# тип дома
|
||||||
TYPE_OF_HOUSE_BLOCK = 'block'
|
TYPE_OF_HOUSE_BLOCK = 'block'
|
||||||
@ -53,50 +56,51 @@ class Order(models.Model):
|
|||||||
TYPE_OF_HOUSE_PANEL = 'panel'
|
TYPE_OF_HOUSE_PANEL = 'panel'
|
||||||
|
|
||||||
TYPE_OF_HOUSE_CHOICES = [
|
TYPE_OF_HOUSE_CHOICES = [
|
||||||
(CHOICE_UNDEFINED, 'Не указан'),
|
|
||||||
(TYPE_OF_HOUSE_BLOCK, 'Блочный'),
|
(TYPE_OF_HOUSE_BLOCK, 'Блочный'),
|
||||||
(TYPE_OF_HOUSE_BRICK, 'Кирпичный'),
|
(TYPE_OF_HOUSE_BRICK, 'Кирпичный'),
|
||||||
(TYPE_OF_HOUSE_MONOLITH, 'Монолит'),
|
(TYPE_OF_HOUSE_MONOLITH, 'Монолит'),
|
||||||
(TYPE_OF_HOUSE_PANEL, 'Панельный'),
|
(TYPE_OF_HOUSE_PANEL, 'Панельный'),
|
||||||
]
|
]
|
||||||
type_of_house = models.CharField(max_length=10, choices=TYPE_OF_HOUSE_CHOICES)
|
type_of_house = models.CharField(max_length=10, choices=TYPE_OF_HOUSE_CHOICES, blank=True, default=CHOICE_UNDEFINED,
|
||||||
|
verbose_name="Тип дома")
|
||||||
|
|
||||||
# тип квартиры
|
# тип квартиры
|
||||||
TYPE_OF_ROOM_PRIMARY = 'primary'
|
TYPE_OF_ROOM_PRIMARY = 'primary'
|
||||||
TYPE_OF_ROOM_SECONDARY = 'secondary'
|
TYPE_OF_ROOM_SECONDARY = 'secondary'
|
||||||
|
|
||||||
TYPE_OF_ROOM_CHOICES = [
|
TYPE_OF_ROOM_CHOICES = [
|
||||||
(CHOICE_UNDEFINED, 'Не указан'),
|
|
||||||
(TYPE_OF_ROOM_PRIMARY, 'Первичка'),
|
(TYPE_OF_ROOM_PRIMARY, 'Первичка'),
|
||||||
(TYPE_OF_ROOM_SECONDARY, 'Вторичка')
|
(TYPE_OF_ROOM_SECONDARY, 'Вторичка')
|
||||||
]
|
]
|
||||||
type_of_room = models.CharField(max_length=10, choices=TYPE_OF_ROOM_CHOICES)
|
type_of_room = models.CharField(max_length=10, choices=TYPE_OF_ROOM_CHOICES, blank=True, default=CHOICE_UNDEFINED,
|
||||||
|
verbose_name="Тип квартиры")
|
||||||
|
|
||||||
# требуется дизайн проект
|
# требуется дизайн проект
|
||||||
REQUIRED_DESIGN_CHOICES = ((None, 'Не указано'), (True, 'Да'), (False, 'Нет'))
|
REQUIRED_DESIGN_CHOICES = ((True, 'Да'), (False, 'Нет'))
|
||||||
is_require_design = models.BooleanField(default=None, blank=True, null=True, choices=REQUIRED_DESIGN_CHOICES)
|
is_require_design = models.BooleanField(default=None, blank=True, null=True, choices=REQUIRED_DESIGN_CHOICES,
|
||||||
|
verbose_name="Требуется дизайн проект")
|
||||||
|
|
||||||
# закуп материала
|
# закуп материала
|
||||||
PURCHASE_OF_MATERIAL_EXECUTOR = 'executor'
|
PURCHASE_OF_MATERIAL_EXECUTOR = 'executor'
|
||||||
PURCHASE_OF_MATERIAL_CUSTOMER = 'customer'
|
PURCHASE_OF_MATERIAL_CUSTOMER = 'customer'
|
||||||
|
|
||||||
PURCHASE_OF_MATERIAL_CHOICES = [
|
PURCHASE_OF_MATERIAL_CHOICES = [
|
||||||
(CHOICE_UNDEFINED, 'Не указано'),
|
|
||||||
(PURCHASE_OF_MATERIAL_EXECUTOR, 'Исполнитель'),
|
(PURCHASE_OF_MATERIAL_EXECUTOR, 'Исполнитель'),
|
||||||
(PURCHASE_OF_MATERIAL_CUSTOMER, 'Заказчик')
|
(PURCHASE_OF_MATERIAL_CUSTOMER, 'Заказчик')
|
||||||
]
|
]
|
||||||
purchase_of_material = models.CharField(max_length=10, choices=PURCHASE_OF_MATERIAL_CHOICES)
|
purchase_of_material = models.CharField(max_length=10, choices=PURCHASE_OF_MATERIAL_CHOICES,
|
||||||
|
blank=True, default=CHOICE_UNDEFINED, verbose_name="Закуп материала")
|
||||||
|
|
||||||
# тип исполнителя
|
# тип исполнителя
|
||||||
TYPE_OF_EXECUTOR_INDIVIDUAL = 'individual'
|
TYPE_OF_EXECUTOR_INDIVIDUAL = 'individual'
|
||||||
TYPE_OF_EXECUTOR_COMPANY = 'company'
|
TYPE_OF_EXECUTOR_COMPANY = 'company'
|
||||||
|
|
||||||
TYPE_OF_EXECUTOR_CHOICES = [
|
TYPE_OF_EXECUTOR_CHOICES = [
|
||||||
(CHOICE_UNDEFINED, 'Не указан'),
|
|
||||||
(TYPE_OF_EXECUTOR_INDIVIDUAL, 'Самозанятый/бригада'),
|
(TYPE_OF_EXECUTOR_INDIVIDUAL, 'Самозанятый/бригада'),
|
||||||
(TYPE_OF_EXECUTOR_COMPANY, 'Компания')
|
(TYPE_OF_EXECUTOR_COMPANY, 'Компания')
|
||||||
]
|
]
|
||||||
type_of_executor = models.CharField(max_length=10, choices=TYPE_OF_EXECUTOR_CHOICES)
|
type_of_executor = models.CharField(max_length=10, choices=TYPE_OF_EXECUTOR_CHOICES,
|
||||||
|
blank=True, default=CHOICE_UNDEFINED, verbose_name="Тип исполнителя")
|
||||||
|
|
||||||
# дальше отдельные параметры
|
# дальше отдельные параметры
|
||||||
is_with_warranty = models.BooleanField(default=True, verbose_name="С гарантией")
|
is_with_warranty = models.BooleanField(default=True, verbose_name="С гарантией")
|
||||||
@ -106,9 +110,13 @@ class Order(models.Model):
|
|||||||
is_with_garbage_removal = models.BooleanField(default=False, verbose_name="С вывозом мусора")
|
is_with_garbage_removal = models.BooleanField(default=False, verbose_name="С вывозом мусора")
|
||||||
|
|
||||||
# примерная цена
|
# примерная цена
|
||||||
approximate_price = models.DecimalField(max_digits=9, decimal_places=2, blank=False, verbose_name="Цена")
|
approximate_price = models.DecimalField(max_digits=12, decimal_places=2, blank=False, verbose_name="Цена")
|
||||||
|
|
||||||
# address_city = models.ForeignKey(City, on_delete=models.CASCADE, blank=False, related_name="address_city")
|
date_start = models.DateField(blank=True, default=None, verbose_name="Дата начала")
|
||||||
|
date_end = models.DateField(blank=True, default=None, verbose_name="Дата окончания")
|
||||||
|
|
||||||
|
address_city = models.ForeignKey(City, on_delete=models.CASCADE, blank=False, related_name="address_city",
|
||||||
|
verbose_name="Город")
|
||||||
address_text = models.CharField(max_length=70, blank=True, verbose_name="Улица, дом")
|
address_text = models.CharField(max_length=70, blank=True, verbose_name="Улица, дом")
|
||||||
|
|
||||||
owner = models.ForeignKey(SiteUser, on_delete=models.CASCADE, null=True, related_name="owner",
|
owner = models.ForeignKey(SiteUser, on_delete=models.CASCADE, null=True, related_name="owner",
|
||||||
|
@ -22,5 +22,5 @@ def order_create(request):
|
|||||||
return HttpResponseRedirect('/account')
|
return HttpResponseRedirect('/account')
|
||||||
else:
|
else:
|
||||||
form = UnregisteredUserOrderCreationForm()
|
form = UnregisteredUserOrderCreationForm()
|
||||||
|
print(form.visible_fields)
|
||||||
return render(request, 'orders/order-create.html', {'form': form})
|
return render(request, 'orders/order-create.html', {'form': form})
|
||||||
|
@ -3,8 +3,36 @@
|
|||||||
|
|
||||||
{% block styles %}
|
{% block styles %}
|
||||||
<style>
|
<style>
|
||||||
.inline-input {
|
.form-section-wrapper {
|
||||||
color: red;
|
display: flex;
|
||||||
|
flex-flow: row wrap;
|
||||||
|
border: aqua dashed 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-section-wrapper > h2 {
|
||||||
|
color: var(--brand-color);
|
||||||
|
width: 10em;
|
||||||
|
padding: 0 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-section-wrapper > div {
|
||||||
|
border: red dashed 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-field-wrapper > * {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-field-wrapper {
|
||||||
|
border: green solid 1px;
|
||||||
|
margin: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-inline-fields, #additional-params-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: row wrap;
|
||||||
|
align-items: stretch;
|
||||||
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@ -17,11 +45,157 @@
|
|||||||
<form action="{% url 'order-create' %}" method="POST">
|
<form action="{% url 'order-create' %}" method="POST">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{# <table>#}
|
{# <table>#}
|
||||||
{# <tbody>#}
|
{# <tbody> <!-- такой вариант не катит, форма не будет такой как на сайте, придется писать все ручками... -->#}
|
||||||
{# {{ form.as_table }}#}
|
{# {{ form.as_table }}#}
|
||||||
{# </tbody>#}
|
{# </tbody>#}
|
||||||
{# </table>#}
|
{# </table>#}
|
||||||
{{ form.as_ul }}
|
{# {{ form.as_ul }}#}
|
||||||
|
|
||||||
|
<!-- ну че ебана в рот, погнали нахуй -->
|
||||||
|
|
||||||
|
<!-- тут должны быть файлы, технично их забываем -->
|
||||||
|
<div class="form-section-wrapper">
|
||||||
|
<h2>Внешний вид</h2>
|
||||||
|
<div>
|
||||||
|
<h4>Тут будут картинки</h4>
|
||||||
|
<h4>Тут будет файл проекта</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- -->
|
||||||
|
<div class="form-section-wrapper">
|
||||||
|
<h2>Параметры</h2>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div class="form-field-wrapper {% if form.name.error %}form-field-error{% endif %}">
|
||||||
|
{{ form.name.errors }}
|
||||||
|
<label for="{{ form.name.id_for_label }}">{{ form.name.label }}</label>
|
||||||
|
{{ form.name }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-inline-fields">
|
||||||
|
<div class="form-field-wrapper {% if form.type_of_renovation.error %}form-field-error{% endif %}">
|
||||||
|
<label for="{{ form.type_of_renovation.id_for_label }}">{{ form.type_of_renovation.label }}</label>
|
||||||
|
{{ form.type_of_renovation }}
|
||||||
|
</div>
|
||||||
|
<div class="form-field-wrapper {% if form.type_of_house.error %}form-field-error{% endif %}">
|
||||||
|
<label for="{{ form.type_of_house.id_for_label }}">{{ form.type_of_house.label }}</label>
|
||||||
|
{{ form.type_of_house }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-inline-fields">
|
||||||
|
<div class="form-field-wrapper">
|
||||||
|
<label for="{{ form.type_of_room.id_for_label }}">{{ form.type_of_room.label }}</label>
|
||||||
|
{{ form.type_of_room }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-field-wrapper">
|
||||||
|
<label for="{{ form.is_require_design.id_for_label }}">{{ form.is_require_design.label }}</label>
|
||||||
|
{{ form.is_require_design }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-field-wrapper">
|
||||||
|
<label for="{{ form.purchase_of_material.id_for_label }}">{{ form.purchase_of_material.label }}</label>
|
||||||
|
{{ form.purchase_of_material }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-field-wrapper">
|
||||||
|
<label for="{{ form.type_of_executor.id_for_label }}">{{ form.type_of_executor.label }}</label>
|
||||||
|
{{ form.type_of_executor }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-field-wrapper">
|
||||||
|
<label>Дополнительные параметры</label>
|
||||||
|
<div id="additional-params-wrapper">
|
||||||
|
<div>
|
||||||
|
{{ form.is_with_warranty }}
|
||||||
|
<label for="{{ form.is_with_warranty.id_for_label }}">{{ form.is_with_warranty.label }}</label>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ form.is_with_contract }}
|
||||||
|
<label for="{{ form.is_with_contract.id_for_label }}">{{ form.is_with_contract.label }}</label>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ form.is_with_trade }}
|
||||||
|
<label for="{{ form.is_with_trade.id_for_label }}">{{ form.is_with_trade.label }}</label>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ form.is_with_cleaning }}
|
||||||
|
<label for="{{ form.is_with_cleaning.id_for_label }}">{{ form.is_with_cleaning.label }}</label>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ form.is_with_garbage_removal }}
|
||||||
|
<label for="{{ form.is_with_garbage_removal.id_for_label }}">{{ form.is_with_garbage_removal.label }}</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-inline-fields">
|
||||||
|
<div class="form-field-wrapper {% if form.square.error %}form-field-error{% endif %}">
|
||||||
|
{{ form.square.errors }}
|
||||||
|
<label for="{{ form.square.id_for_label }}">{{ form.square.label }}</label>
|
||||||
|
{{ form.square }}
|
||||||
|
</div>
|
||||||
|
<div class="form-field-wrapper {% if form.square.error %}form-field-error{% endif %}">
|
||||||
|
{{ form.work_time.errors }}
|
||||||
|
<label for="{{ form.work_time.id_for_label }}">{{ form.work_time.label }}</label>
|
||||||
|
{{ form.work_time }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-field-wrapper {% if form.description.error %}form-field-error{% endif %}">
|
||||||
|
{{ form.description.errors }}
|
||||||
|
<label for="{{ form.description.id_for_label }}">{{ form.description.label }}</label>
|
||||||
|
{{ form.description }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-inline-fields">
|
||||||
|
<div class="form-field-wrapper {% if form.date_start.error %}form-field-error{% endif %}">
|
||||||
|
{{ form.date_start.errors }}
|
||||||
|
<label for="{{ form.date_start.id_for_label }}">{{ form.date_start.label }}</label>
|
||||||
|
{{ form.date_start }}
|
||||||
|
</div>
|
||||||
|
<div class="form-field-wrapper {% if form.date_end.error %}form-field-error{% endif %}">
|
||||||
|
{{ form.date_end.errors }}
|
||||||
|
<label for="{{ form.date_end.id_for_label }}">{{ form.date_end.label }}</label>
|
||||||
|
{{ form.date_end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-field-wrapper {% if form.approximate_price.error %}form-field-error{% endif %}">
|
||||||
|
{{ form.approximate_price.errors }}
|
||||||
|
<label for="{{ form.approximate_price.id_for_label }}">{{ form.approximate_price.label }}</label>
|
||||||
|
{{ form.approximate_price }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-section-wrapper">
|
||||||
|
<h2>Контакты</h2>
|
||||||
|
<div>
|
||||||
|
<div class="form-inline-fields">
|
||||||
|
<h4>Номер телефона</h4>
|
||||||
|
<h4>Почта</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-inline-fields">
|
||||||
|
<div class="form-field-wrapper {% if form.address_city.error %}form-field-error{% endif %}">
|
||||||
|
{{ form.address_city.errors }}
|
||||||
|
<label for="{{ form.address_city.id_for_label }}">{{ form.address_city.label }}</label>
|
||||||
|
{{ form.address_city }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-field-wrapper {% if form.address_text.error %}form-field-error{% endif %}">
|
||||||
|
{{ form.address_text.errors }}
|
||||||
|
<label for="{{ form.address_text.id_for_label }}">{{ form.address_text.label }}</label>
|
||||||
|
{{ form.address_text }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<button type="submit">Опубликовать</button>
|
<button type="submit">Опубликовать</button>
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
Reference in New Issue
Block a user