Classified ads forms
Classified ads forms (English fallback)
Aug. 16, 2025
Posted by admin
Nhom |
Notes |
|
Here’s an explanation of the forms in your classified_ads app:
All forms are styled for Bootstrap and provide user-friendly input, validation, and layout for managing classified ads, images, categories, and inquiries.
|
|
1. ClassifiedAdForm - Main Ad Creation/Editing Form Purpose & Scope This is the core form for creating and editing classified advertisements with full multilingual support (English/Vietnamese) and translation management. Model Fields Included fields = [ 'title', 'title_vi', 'description', 'description_vi', # Multilingual content 'category', 'ad_type', # Classification 'contact_name', 'contact_email', 'contact_phone', 'location', # Contact info 'price', 'price_negotiable', 'expires_at', # Pricing & timing 'translation_status', 'translated_by' # Translation management ] Key Features: A. Multilingual Support 'title': forms.TextInput(attrs={'placeholder': 'Enter a descriptive title in English'}), 'title_vi': forms.TextInput(attrs={'placeholder': 'Enter Vietnamese title (Tiêu đề tiếng Việt)'}),
B. Translation Management System 'translation_status': forms.Select(attrs={'class': 'form-control'}), 'translated_by': forms.TextInput(attrs={'placeholder': 'Translator name'}),
C. User Experience Enhancements def __init__(self, *args, **kwargs): user = kwargs.pop('user', None) # Pre-populate contact info with user data if user and user.is_authenticated: if not self.instance.pk: # Only for new ads self.fields['contact_name'].initial = f"{user.first_name} {user.last_name}".strip() or user.username self.fields['contact_email'].initial = user.email
D. Advanced Layout with Crispy Forms self.helper.layout = Layout( Row(Column('title', css_class='col-12')), Row( Column('category', css_class='col-md-6'), Column('ad_type', css_class='col-md-6'), ), HTML('<h5 class="mt-4 mb-3">Contact Information</h5>'), # ... more sections FormActions( Submit('save_draft', 'Save as Draft', css_class='btn btn-secondary'), Submit('publish', 'Publish Ad', css_class='btn btn-primary'), ) )
E. Input Validation & Formatting 'price': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'}), 'expires_at': forms.DateTimeInput(attrs={'type': 'datetime-local'}), 'price_negotiable': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
|
|
2. AdImageForm & AdImageFormSet - Image Management Image Upload System class AdImageForm(forms.ModelForm): class Meta: model = AdImage fields = ['image', 'caption', 'is_primary'] widgets = { 'image': forms.FileInput(attrs={'accept': 'image/*'}), 'caption': forms.TextInput(attrs={'placeholder': 'Optional caption'}), } AdImageFormSet = forms.inlineformset_factory( ClassifiedAd, AdImage, form=AdImageForm, extra=3, max_num=10, can_delete=True ) Advanced Features:
Usage in Views: # In AdCreateView and AdUpdateView formset = AdImageFormSet(self.request.POST, self.request.FILES, instance=self.object) if formset.is_valid(): formset.save()
|
|
3. AdSearchForm - Advanced Search Interface Comprehensive Search Capabilities class AdSearchForm(forms.Form): q = forms.CharField(required=False) # Text search category = forms.ModelChoiceField(queryset=Category.objects.filter(is_active=True)) ad_type = forms.ChoiceField(choices=[('', 'All Types')] + list(AdType.choices)) location = forms.CharField(required=False) popular_location = forms.ModelChoiceField(queryset=Location.objects.filter(is_popular=True)) price_min = forms.DecimalField(required=False, min_value=0) price_max = forms.DecimalField(required=False, min_value=0) sort_by = forms.ChoiceField(choices=[...], initial='newest') Smart Search Features: A. Dual Location Input location = forms.CharField( widget=forms.TextInput(attrs={'list': 'popular-locations'}) ) popular_location = forms.ModelChoiceField( queryset=Location.objects.filter(is_popular=True), help_text="Quick select from popular locations" )
B. Price Range Filtering price_min = forms.DecimalField( widget=forms.NumberInput(attrs={'step': '0.01', 'placeholder': 'Min price'}) ) price_max = forms.DecimalField( widget=forms.NumberInput(attrs={'step': '0.01', 'placeholder': 'Max price'}) )
C. Advanced Layout & User Experience self.helper.layout = Layout( Row( Column('q', css_class='col-md-3'), Column('category', css_class='col-md-2'), Column('ad_type', css_class='col-md-2'), Column('location', css_class='col-md-3'), Column('popular_location', css_class='col-md-2'), ), Row( Column('price_min', css_class='col-md-2'), Column('price_max', css_class='col-md-2'), Column('sort_by', css_class='col-md-3'), Column(Submit('search', 'Search'), css_class='col-md-2'), Column(HTML('<a href="?" class="btn btn-outline-secondary">Clear</a>'), css_class='col-md-3'), ) )
|
|
4. AdInquiryForm - Contact Communication Structured Communication System class AdInquiryForm(forms.ModelForm): class Meta: model = AdInquiry fields = ['name', 'email', 'phone', 'message'] widgets = { 'message': forms.Textarea(attrs={ 'rows': 4, 'placeholder': 'Your message to the seller...' }), } User Experience Features: def __init__(self, *args, **kwargs): user = kwargs.pop('user', None) # Pre-populate with user data if logged in if user and user.is_authenticated: self.fields['name'].initial = f"{user.first_name} {user.last_name}".strip() or user.username self.fields['email'].initial = user.email
Integration Points:
|
|
5. CategoryForm - Administrative Category Management Hierarchical Category System class CategoryForm(forms.ModelForm): class Meta: model = Category fields = ['name', 'description', 'parent', 'icon', 'slug', 'is_active'] widgets = { 'icon': forms.TextInput(attrs={'placeholder': 'e.g., fas fa-car'}), 'slug': forms.TextInput(attrs={'class': 'form-control'}), } Administrative Features:
|
|
Form Integration Patterns 1. View Integration # In views.py def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs['user'] = self.request.user # Pass user context return kwargs 2. Template Usage <!-- In templates --> {{ form|crispy }} {{ formset|crispy }} 3. AJAX Enhancement // JavaScript integration for dynamic features function toggleFavorite(adId) { // AJAX calls work with form data }
|
|
Advanced Form Features 1. Validation Logic
2. Internationalization
3. Performance Optimizations
4. Security Features
|
|
Usage Scenarios 1. New Ad Creation
2. Ad Search & Filtering
3. User Communication
This form system provides a complete, user-friendly interface for all classified ads operations with advanced features like multilingual support, image management, and sophisticated search capabilities.
|
Nhom |
Notes |
|
Here’s an explanation of the forms in your classified_ads app:
All forms are styled for Bootstrap and provide user-friendly input, validation, and layout for managing classified ads, images, categories, and inquiries.
|
|
1. ClassifiedAdForm - Main Ad Creation/Editing Form Purpose & Scope This is the core form for creating and editing classified advertisements with full multilingual support (English/Vietnamese) and translation management. Model Fields Included fields = [ 'title', 'title_vi', 'description', 'description_vi', # Multilingual content 'category', 'ad_type', # Classification 'contact_name', 'contact_email', 'contact_phone', 'location', # Contact info 'price', 'price_negotiable', 'expires_at', # Pricing & timing 'translation_status', 'translated_by' # Translation management ] Key Features: A. Multilingual Support 'title': forms.TextInput(attrs={'placeholder': 'Enter a descriptive title in English'}), 'title_vi': forms.TextInput(attrs={'placeholder': 'Enter Vietnamese title (Tiêu đề tiếng Việt)'}),
B. Translation Management System 'translation_status': forms.Select(attrs={'class': 'form-control'}), 'translated_by': forms.TextInput(attrs={'placeholder': 'Translator name'}),
C. User Experience Enhancements def __init__(self, *args, **kwargs): user = kwargs.pop('user', None) # Pre-populate contact info with user data if user and user.is_authenticated: if not self.instance.pk: # Only for new ads self.fields['contact_name'].initial = f"{user.first_name} {user.last_name}".strip() or user.username self.fields['contact_email'].initial = user.email
D. Advanced Layout with Crispy Forms self.helper.layout = Layout( Row(Column('title', css_class='col-12')), Row( Column('category', css_class='col-md-6'), Column('ad_type', css_class='col-md-6'), ), HTML('<h5 class="mt-4 mb-3">Contact Information</h5>'), # ... more sections FormActions( Submit('save_draft', 'Save as Draft', css_class='btn btn-secondary'), Submit('publish', 'Publish Ad', css_class='btn btn-primary'), ) )
E. Input Validation & Formatting 'price': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'}), 'expires_at': forms.DateTimeInput(attrs={'type': 'datetime-local'}), 'price_negotiable': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
|
|
2. AdImageForm & AdImageFormSet - Image Management Image Upload System class AdImageForm(forms.ModelForm): class Meta: model = AdImage fields = ['image', 'caption', 'is_primary'] widgets = { 'image': forms.FileInput(attrs={'accept': 'image/*'}), 'caption': forms.TextInput(attrs={'placeholder': 'Optional caption'}), } AdImageFormSet = forms.inlineformset_factory( ClassifiedAd, AdImage, form=AdImageForm, extra=3, max_num=10, can_delete=True ) Advanced Features:
Usage in Views: # In AdCreateView and AdUpdateView formset = AdImageFormSet(self.request.POST, self.request.FILES, instance=self.object) if formset.is_valid(): formset.save()
|
|
3. AdSearchForm - Advanced Search Interface Comprehensive Search Capabilities class AdSearchForm(forms.Form): q = forms.CharField(required=False) # Text search category = forms.ModelChoiceField(queryset=Category.objects.filter(is_active=True)) ad_type = forms.ChoiceField(choices=[('', 'All Types')] + list(AdType.choices)) location = forms.CharField(required=False) popular_location = forms.ModelChoiceField(queryset=Location.objects.filter(is_popular=True)) price_min = forms.DecimalField(required=False, min_value=0) price_max = forms.DecimalField(required=False, min_value=0) sort_by = forms.ChoiceField(choices=[...], initial='newest') Smart Search Features: A. Dual Location Input location = forms.CharField( widget=forms.TextInput(attrs={'list': 'popular-locations'}) ) popular_location = forms.ModelChoiceField( queryset=Location.objects.filter(is_popular=True), help_text="Quick select from popular locations" )
B. Price Range Filtering price_min = forms.DecimalField( widget=forms.NumberInput(attrs={'step': '0.01', 'placeholder': 'Min price'}) ) price_max = forms.DecimalField( widget=forms.NumberInput(attrs={'step': '0.01', 'placeholder': 'Max price'}) )
C. Advanced Layout & User Experience self.helper.layout = Layout( Row( Column('q', css_class='col-md-3'), Column('category', css_class='col-md-2'), Column('ad_type', css_class='col-md-2'), Column('location', css_class='col-md-3'), Column('popular_location', css_class='col-md-2'), ), Row( Column('price_min', css_class='col-md-2'), Column('price_max', css_class='col-md-2'), Column('sort_by', css_class='col-md-3'), Column(Submit('search', 'Search'), css_class='col-md-2'), Column(HTML('<a href="?" class="btn btn-outline-secondary">Clear</a>'), css_class='col-md-3'), ) )
|
|
4. AdInquiryForm - Contact Communication Structured Communication System class AdInquiryForm(forms.ModelForm): class Meta: model = AdInquiry fields = ['name', 'email', 'phone', 'message'] widgets = { 'message': forms.Textarea(attrs={ 'rows': 4, 'placeholder': 'Your message to the seller...' }), } User Experience Features: def __init__(self, *args, **kwargs): user = kwargs.pop('user', None) # Pre-populate with user data if logged in if user and user.is_authenticated: self.fields['name'].initial = f"{user.first_name} {user.last_name}".strip() or user.username self.fields['email'].initial = user.email
Integration Points:
|
|
5. CategoryForm - Administrative Category Management Hierarchical Category System class CategoryForm(forms.ModelForm): class Meta: model = Category fields = ['name', 'description', 'parent', 'icon', 'slug', 'is_active'] widgets = { 'icon': forms.TextInput(attrs={'placeholder': 'e.g., fas fa-car'}), 'slug': forms.TextInput(attrs={'class': 'form-control'}), } Administrative Features:
|
|
Form Integration Patterns 1. View Integration # In views.py def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs['user'] = self.request.user # Pass user context return kwargs 2. Template Usage <!-- In templates --> {{ form|crispy }} {{ formset|crispy }} 3. AJAX Enhancement // JavaScript integration for dynamic features function toggleFavorite(adId) { // AJAX calls work with form data }
|
|
Advanced Form Features 1. Validation Logic
2. Internationalization
3. Performance Optimizations
4. Security Features
|
|
Usage Scenarios 1. New Ad Creation
2. Ad Search & Filtering
3. User Communication
This form system provides a complete, user-friendly interface for all classified ads operations with advanced features like multilingual support, image management, and sophisticated search capabilities.
|
Attached Files
You are viewing this article in public mode. Some features may be limited.