diff --git a/order/admin.py b/order/admin.py index 90a0f39..de3fb3c 100644 --- a/order/admin.py +++ b/order/admin.py @@ -9,5 +9,5 @@ class CityAdmin(admin.ModelAdmin): @admin.register(Order) -class CityAdmin(admin.ModelAdmin): +class OrderAdmin(admin.ModelAdmin): pass diff --git a/order/forms.py b/order/forms.py index d5f55c4..db99637 100644 --- a/order/forms.py +++ b/order/forms.py @@ -1,52 +1,29 @@ from django import forms from django.core.validators import RegexValidator - from .models import * -class BaseOrderCreationForm(forms.Form): - name = forms.CharField(max_length=200, label="Название заказа", help_text='help text') - description = forms.CharField(widget=forms.Textarea, label="Описание", required=False) +class BaseOrderCreationForm(forms.ModelForm): - 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, - label="Тип ремонта") - - type_of_house = forms.ChoiceField(choices=Order.TYPE_OF_HOUSE_CHOICES, required=False, label="Тип дома") - - type_of_room = forms.ChoiceField(choices=Order.TYPE_OF_ROOM_CHOICES, required=False, - label="Тип квартиры", widget=forms.RadioSelect) - - # требуется дизайн проект - 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 Meta: + model = Order + fields = [ + 'name', 'description', 'square', + 'type_of_renovation', 'type_of_house', 'type_of_room', + 'is_require_design', 'purchase_of_material', 'type_of_executor', + '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', + ] class UnregisteredUserOrderCreationForm(BaseOrderCreationForm): diff --git a/order/models.py b/order/models.py index 4190b82..8af41d0 100644 --- a/order/models.py +++ b/order/models.py @@ -1,10 +1,13 @@ +from django.core.validators import RegexValidator from django.db import models from account.models import SiteUser 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="Название города") def __str__(self): @@ -17,13 +20,13 @@ class City(models.Model): class Order(models.Model): # основные поля: название и описание - name = models.CharField(max_length=200) - description = models.TextField(blank=True) + name = models.CharField(max_length=200, verbose_name="Название заказа") + 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_CHOICES = [ - (CHOICE_UNDEFINED, 'Не указан'), (TYPE_OF_RENOVATION_OVERHAUL, 'Капитальный'), (TYPE_OF_RENOVATION_PARTIAL, 'Частичный'), (TYPE_OF_RENOVATION_REDECOR, 'Косметический'), (TYPE_OF_RENOVATION_PREMIUM, 'Премиальный'), (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' @@ -53,50 +56,51 @@ class Order(models.Model): TYPE_OF_HOUSE_PANEL = 'panel' TYPE_OF_HOUSE_CHOICES = [ - (CHOICE_UNDEFINED, 'Не указан'), (TYPE_OF_HOUSE_BLOCK, 'Блочный'), (TYPE_OF_HOUSE_BRICK, 'Кирпичный'), (TYPE_OF_HOUSE_MONOLITH, 'Монолит'), (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_SECONDARY = 'secondary' TYPE_OF_ROOM_CHOICES = [ - (CHOICE_UNDEFINED, 'Не указан'), (TYPE_OF_ROOM_PRIMARY, 'Первичка'), (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, 'Нет')) - is_require_design = models.BooleanField(default=None, blank=True, null=True, choices=REQUIRED_DESIGN_CHOICES) + REQUIRED_DESIGN_CHOICES = ((True, 'Да'), (False, 'Нет')) + 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_CUSTOMER = 'customer' PURCHASE_OF_MATERIAL_CHOICES = [ - (CHOICE_UNDEFINED, 'Не указано'), (PURCHASE_OF_MATERIAL_EXECUTOR, 'Исполнитель'), (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_COMPANY = 'company' TYPE_OF_EXECUTOR_CHOICES = [ - (CHOICE_UNDEFINED, 'Не указан'), (TYPE_OF_EXECUTOR_INDIVIDUAL, 'Самозанятый/бригада'), (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="С гарантией") @@ -106,9 +110,13 @@ class Order(models.Model): 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="Улица, дом") owner = models.ForeignKey(SiteUser, on_delete=models.CASCADE, null=True, related_name="owner", diff --git a/order/views.py b/order/views.py index a117f4e..c5ba10c 100644 --- a/order/views.py +++ b/order/views.py @@ -22,5 +22,5 @@ def order_create(request): return HttpResponseRedirect('/account') else: form = UnregisteredUserOrderCreationForm() - + print(form.visible_fields) return render(request, 'orders/order-create.html', {'form': form}) diff --git a/templates/orders/order-create.html b/templates/orders/order-create.html index 5c6c145..8c1e745 100644 --- a/templates/orders/order-create.html +++ b/templates/orders/order-create.html @@ -3,8 +3,36 @@ {% block styles %} {% endblock %} @@ -17,11 +45,157 @@
{% csrf_token %} {# #} -{# #} +{# #} {# {{ form.as_table }}#} {# #} {#
#} - {{ form.as_ul }} +{# {{ form.as_ul }}#} + + + + +
+

Внешний вид

+
+

Тут будут картинки

+

Тут будет файл проекта

+
+
+ + +
+

Параметры

+ +
+
+ {{ form.name.errors }} + + {{ form.name }} +
+ +
+
+ + {{ form.type_of_renovation }} +
+
+ + {{ form.type_of_house }} +
+
+ +
+
+ + {{ form.type_of_room }} +
+ +
+ + {{ form.is_require_design }} +
+ +
+ + {{ form.purchase_of_material }} +
+ +
+ + {{ form.type_of_executor }} +
+
+ +
+ +
+
+ {{ form.is_with_warranty }} + +
+
+ {{ form.is_with_contract }} + +
+
+ {{ form.is_with_trade }} + +
+
+ {{ form.is_with_cleaning }} + +
+
+ {{ form.is_with_garbage_removal }} + +
+
+
+ +
+
+ {{ form.square.errors }} + + {{ form.square }} +
+
+ {{ form.work_time.errors }} + + {{ form.work_time }} +
+
+ +
+ {{ form.description.errors }} + + {{ form.description }} +
+ +
+
+ {{ form.date_start.errors }} + + {{ form.date_start }} +
+
+ {{ form.date_end.errors }} + + {{ form.date_end }} +
+
+ +
+ {{ form.approximate_price.errors }} + + {{ form.approximate_price }} +
+
+
+ +
+

Контакты

+
+
+

Номер телефона

+

Почта

+
+ +
+
+ {{ form.address_city.errors }} + + {{ form.address_city }} +
+ +
+ {{ form.address_text.errors }} + + {{ form.address_text }} +
+
+
+
+
{% endblock %}