rebuild of detail of product
This commit is contained in:
@@ -119,6 +119,14 @@ class DetailModelAdmin(ModelAdmin, ImportExportModelAdmin):
|
|||||||
"widget": ArrayWidget,
|
"widget": ArrayWidget,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class DetailInLine(StackedInline):
|
||||||
|
model = DetailModel
|
||||||
|
extra = 0
|
||||||
|
show_change_link = True
|
||||||
|
min_num = 1
|
||||||
|
max_num = 4
|
||||||
|
|
||||||
@admin.register(ProductDetailModel)
|
@admin.register(ProductDetailModel)
|
||||||
class ProductDetailModel1Admin(ModelAdmin, ImportExportModelAdmin):
|
class ProductDetailModel1Admin(ModelAdmin, ImportExportModelAdmin):
|
||||||
import_form_class = ImportForm
|
import_form_class = ImportForm
|
||||||
@@ -126,7 +134,8 @@ class ProductDetailModel1Admin(ModelAdmin, ImportExportModelAdmin):
|
|||||||
search_fields = ['detail_category__title', 'name']
|
search_fields = ['detail_category__title', 'name']
|
||||||
compressed_fields = True
|
compressed_fields = True
|
||||||
warn_unsaved_form = True
|
warn_unsaved_form = True
|
||||||
|
autocomplete_fields = ['detail_category',]
|
||||||
|
inlines = [DetailInLine]
|
||||||
formfield_overrides = {
|
formfield_overrides = {
|
||||||
ArrayField: {
|
ArrayField: {
|
||||||
"widget": ArrayWidget,
|
"widget": ArrayWidget,
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 5.1.2 on 2025-04-22 16:46
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('product', '0037_productdetailmodel_name'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='detailmodel',
|
||||||
|
name='name',
|
||||||
|
field=models.CharField(default='', help_text='این فیلد فقط برای راحتی در استفاده و جست و جو در پنل ادمین میباشد و در وبسایت نمایش نخواهد داده شد', max_length=50, verbose_name='نام چزيیات'),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Generated by Django 5.1.2 on 2025-04-22 17:02
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('product', '0038_detailmodel_name'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='productdetailmodel',
|
||||||
|
name='detail',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='detailmodel',
|
||||||
|
name='detail_model',
|
||||||
|
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='product.productdetailmodel', verbose_name='دسته بندی جزيات'),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# Generated by Django 5.1.2 on 2025-04-22 17:04
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('product', '0039_remove_productdetailmodel_detail_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='detailmodel',
|
||||||
|
name='name',
|
||||||
|
),
|
||||||
|
]
|
||||||
+16
-16
@@ -129,18 +129,6 @@ class ProductModel(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
class DetailModel(models.Model):
|
|
||||||
title = models.CharField(max_length=50, verbose_name='عنوان')
|
|
||||||
detail_text1 = models.CharField(max_length=150 , verbose_name='متن جزیات ۱')
|
|
||||||
detail_text2 = models.CharField(max_length=150 , verbose_name='متن جزیات ۲', blank=True, null=True)
|
|
||||||
detail_text3 = models.CharField(max_length=150 , verbose_name='متن جزیات ۳', blank=True, null=True)
|
|
||||||
detail_text4 = models.CharField(max_length=150 , verbose_name='متن جزیات ۴', blank=True, null=True)
|
|
||||||
def __str__(self):
|
|
||||||
return self.title
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = 'مدل جزیات'
|
|
||||||
verbose_name_plural = 'مدل های جزیات'
|
|
||||||
|
|
||||||
|
|
||||||
class ProductDetailCategory(models.Model):
|
class ProductDetailCategory(models.Model):
|
||||||
@@ -176,8 +164,6 @@ class CommentModel(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.user}-{self.content[:30]}"
|
return f"{self.user}-{self.content[:30]}"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class AttributeType(models.Model):
|
class AttributeType(models.Model):
|
||||||
name = models.CharField(verbose_name='نام نوع متغییر', max_length=100)
|
name = models.CharField(verbose_name='نام نوع متغییر', max_length=100)
|
||||||
|
|
||||||
@@ -199,7 +185,6 @@ class AttributeValue(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.attribute_type}: {self.value}"
|
return f"{self.attribute_type}: {self.value}"
|
||||||
|
|
||||||
|
|
||||||
class ProductImageModel(models.Model):
|
class ProductImageModel(models.Model):
|
||||||
name = models.CharField(max_length=30, verbose_name='نام عکس')
|
name = models.CharField(max_length=30, verbose_name='نام عکس')
|
||||||
image = models.ImageField(upload_to='product_images/')
|
image = models.ImageField(upload_to='product_images/')
|
||||||
@@ -215,7 +200,6 @@ class ProductImageModel(models.Model):
|
|||||||
class ProductDetailModel(models.Model):
|
class ProductDetailModel(models.Model):
|
||||||
name = models.CharField(max_length=50, verbose_name='نام جزيیات', help_text='این متن فقط برای راحتی در استفاده از پنل ادمین میباشد')
|
name = models.CharField(max_length=50, verbose_name='نام جزيیات', help_text='این متن فقط برای راحتی در استفاده از پنل ادمین میباشد')
|
||||||
detail_category = models.ForeignKey(ProductDetailCategory, on_delete=models.CASCADE, verbose_name='دسته بندی جزيات')
|
detail_category = models.ForeignKey(ProductDetailCategory, on_delete=models.CASCADE, verbose_name='دسته بندی جزيات')
|
||||||
detail = models.ManyToManyField(DetailModel, verbose_name='جزيات ها')
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = 'جزیات محصول'
|
verbose_name = 'جزیات محصول'
|
||||||
@@ -223,6 +207,22 @@ class ProductDetailModel(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f'جزيیات محصول {self.detail_category.title} - {self.name}'
|
return f'جزيیات محصول {self.detail_category.title} - {self.name}'
|
||||||
|
|
||||||
|
|
||||||
|
class DetailModel(models.Model):
|
||||||
|
title = models.CharField(max_length=50, verbose_name='عنوان')
|
||||||
|
detail_text1 = models.CharField(max_length=150 , verbose_name='متن جزیات ۱')
|
||||||
|
detail_text2 = models.CharField(max_length=150 , verbose_name='متن جزیات ۲', blank=True, null=True)
|
||||||
|
detail_text3 = models.CharField(max_length=150 , verbose_name='متن جزیات ۳', blank=True, null=True)
|
||||||
|
detail_text4 = models.CharField(max_length=150 , verbose_name='متن جزیات ۴', blank=True, null=True)
|
||||||
|
detail_model = models.ForeignKey(ProductDetailModel, on_delete=models.CASCADE, verbose_name='دسته بندی جزيات', related_name='details')
|
||||||
|
def __str__(self):
|
||||||
|
return f'{self.title}'
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = 'مدل جزیات'
|
||||||
|
verbose_name_plural = 'مدل های جزیات'
|
||||||
|
|
||||||
|
|
||||||
class ProductVariant(models.Model):
|
class ProductVariant(models.Model):
|
||||||
product = models.ForeignKey(ProductModel, on_delete=models.CASCADE, related_name='variants', verbose_name='محصول')
|
product = models.ForeignKey(ProductModel, on_delete=models.CASCADE, related_name='variants', verbose_name='محصول')
|
||||||
product_attributes = models.ManyToManyField(AttributeValue, verbose_name='ویژگیها', related_name='variant')
|
product_attributes = models.ManyToManyField(AttributeValue, verbose_name='ویژگیها', related_name='variant')
|
||||||
|
|||||||
@@ -10,14 +10,14 @@ from django.contrib.auth.models import AnonymousUser
|
|||||||
class DetailSerializer(serializers.ModelSerializer):
|
class DetailSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = DetailModel
|
model = DetailModel
|
||||||
fields = '__all__'
|
exclude = ['detail_model']
|
||||||
|
|
||||||
class ProductDetailSerializer(serializers.ModelSerializer):
|
class ProductDetailSerializer(serializers.ModelSerializer):
|
||||||
detail = DetailSerializer(many=True, read_only=True)
|
details = DetailSerializer(many=True, read_only=True)
|
||||||
detail_category = serializers.StringRelatedField()
|
detail_category = serializers.StringRelatedField()
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ProductDetailModel
|
model = ProductDetailModel
|
||||||
fields = "__all__"
|
exclude = ['name']
|
||||||
|
|
||||||
|
|
||||||
class AttributeTypeSerialzier(serializers.ModelSerializer):
|
class AttributeTypeSerialzier(serializers.ModelSerializer):
|
||||||
|
|||||||
Reference in New Issue
Block a user