Упрощена модель Shop и реализован полный CRUD для магазинов
- Упрощена модель Shop: только name обязательное поле - Удалены поля: district, режим работы, координаты, инструкции - Description перенесено после name - Все поля кроме name теперь опциональные - Создан полный CRUD для магазинов: * ShopListView - список магазинов с пагинацией * ShopCreateView - создание нового магазина * ShopUpdateView - редактирование магазина * ShopDeleteView - удаление с подтверждением - Создана форма ShopForm с Bootstrap стилями - Поле "Название магазина" помечено как обязательное (*) - Настроена обработка PhoneNumberField - Созданы шаблоны: * shop_list.html - таблица со списком магазинов * shop_form.html - форма создания/редактирования * shop_confirm_delete.html - подтверждение удаления - Настроены URLs для приложения shops - Добавлена ссылка "Магазины" в главную навигацию - Обновлена админ-панель shops 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
56
myproject/shops/forms.py
Normal file
56
myproject/shops/forms.py
Normal file
@@ -0,0 +1,56 @@
|
||||
from django import forms
|
||||
from phonenumber_field.formfields import PhoneNumberField
|
||||
from .models import Shop
|
||||
|
||||
|
||||
class ShopForm(forms.ModelForm):
|
||||
phone = PhoneNumberField(
|
||||
region='BY',
|
||||
required=False,
|
||||
help_text='Формат: +375XXXXXXXXX или 80XXXXXXXXX',
|
||||
widget=forms.TextInput(attrs={'placeholder': '+375XXXXXXXXX'})
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = Shop
|
||||
fields = [
|
||||
'name',
|
||||
'description',
|
||||
'street',
|
||||
'building_number',
|
||||
'phone',
|
||||
'email',
|
||||
'is_active',
|
||||
'is_pickup_point',
|
||||
]
|
||||
widgets = {
|
||||
'description': forms.Textarea(attrs={'rows': 3}),
|
||||
}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
# Ensure phone displays in E.164 format
|
||||
if self.instance and self.instance.phone:
|
||||
self.initial['phone'] = str(self.instance.phone)
|
||||
|
||||
# Mark name field as required with label
|
||||
self.fields['name'].label = 'Название магазина *'
|
||||
self.fields['name'].required = True
|
||||
|
||||
for field_name, field in self.fields.items():
|
||||
if field_name == 'description':
|
||||
# Textarea already has rows=3 from widget, just add class
|
||||
field.widget.attrs.update({'class': 'form-control'})
|
||||
elif field_name in ['is_active', 'is_pickup_point']:
|
||||
# Checkbox fields need form-check-input class
|
||||
field.widget.attrs.update({'class': 'form-check-input'})
|
||||
elif field_name == 'phone':
|
||||
# Phone field gets form-control class
|
||||
field.widget.attrs.update({'class': 'form-control'})
|
||||
else:
|
||||
# Regular input fields get form-control class
|
||||
field.widget.attrs.update({'class': 'form-control'})
|
||||
|
||||
# Add required attribute to HTML for name field
|
||||
if field_name == 'name':
|
||||
field.widget.attrs.update({'required': 'required'})
|
||||
Reference in New Issue
Block a user