diff --git a/backend/product/admin.py b/backend/product/admin.py index 80ac965..1f1b709 100644 --- a/backend/product/admin.py +++ b/backend/product/admin.py @@ -119,6 +119,14 @@ class DetailModelAdmin(ModelAdmin, ImportExportModelAdmin): "widget": ArrayWidget, } } + +class DetailInLine(StackedInline): + model = DetailModel + extra = 0 + show_change_link = True + min_num = 1 + max_num = 4 + @admin.register(ProductDetailModel) class ProductDetailModel1Admin(ModelAdmin, ImportExportModelAdmin): import_form_class = ImportForm @@ -126,7 +134,8 @@ class ProductDetailModel1Admin(ModelAdmin, ImportExportModelAdmin): search_fields = ['detail_category__title', 'name'] compressed_fields = True warn_unsaved_form = True - + autocomplete_fields = ['detail_category',] + inlines = [DetailInLine] formfield_overrides = { ArrayField: { "widget": ArrayWidget, diff --git a/backend/product/migrations/0038_detailmodel_name.py b/backend/product/migrations/0038_detailmodel_name.py new file mode 100644 index 0000000..33082ac --- /dev/null +++ b/backend/product/migrations/0038_detailmodel_name.py @@ -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, + ), + ] diff --git a/backend/product/migrations/0039_remove_productdetailmodel_detail_and_more.py b/backend/product/migrations/0039_remove_productdetailmodel_detail_and_more.py new file mode 100644 index 0000000..909f196 --- /dev/null +++ b/backend/product/migrations/0039_remove_productdetailmodel_detail_and_more.py @@ -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, + ), + ] diff --git a/backend/product/migrations/0040_remove_detailmodel_name.py b/backend/product/migrations/0040_remove_detailmodel_name.py new file mode 100644 index 0000000..d12ad16 --- /dev/null +++ b/backend/product/migrations/0040_remove_detailmodel_name.py @@ -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', + ), + ] diff --git a/backend/product/models.py b/backend/product/models.py index 1a87333..7d8c160 100644 --- a/backend/product/models.py +++ b/backend/product/models.py @@ -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): @@ -176,8 +164,6 @@ class CommentModel(models.Model): def __str__(self): return f"{self.user}-{self.content[:30]}" - - class AttributeType(models.Model): name = models.CharField(verbose_name='نام نوع متغییر', max_length=100) @@ -199,7 +185,6 @@ class AttributeValue(models.Model): def __str__(self): return f"{self.attribute_type}: {self.value}" - class ProductImageModel(models.Model): name = models.CharField(max_length=30, verbose_name='نام عکس') image = models.ImageField(upload_to='product_images/') @@ -215,7 +200,6 @@ class ProductImageModel(models.Model): class ProductDetailModel(models.Model): name = models.CharField(max_length=50, verbose_name='نام جزيیات', help_text='این متن فقط برای راحتی در استفاده از پنل ادمین میباشد') detail_category = models.ForeignKey(ProductDetailCategory, on_delete=models.CASCADE, verbose_name='دسته بندی جزيات') - detail = models.ManyToManyField(DetailModel, verbose_name='جزيات ها') class Meta: verbose_name = 'جزیات محصول' @@ -223,6 +207,22 @@ class ProductDetailModel(models.Model): def __str__(self): 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): product = models.ForeignKey(ProductModel, on_delete=models.CASCADE, related_name='variants', verbose_name='محصول') product_attributes = models.ManyToManyField(AttributeValue, verbose_name='ویژگی‌ها', related_name='variant') diff --git a/backend/product/serializers.py b/backend/product/serializers.py index 984b8f0..af7cf93 100644 --- a/backend/product/serializers.py +++ b/backend/product/serializers.py @@ -10,14 +10,14 @@ from django.contrib.auth.models import AnonymousUser class DetailSerializer(serializers.ModelSerializer): class Meta: model = DetailModel - fields = '__all__' + exclude = ['detail_model'] class ProductDetailSerializer(serializers.ModelSerializer): - detail = DetailSerializer(many=True, read_only=True) + details = DetailSerializer(many=True, read_only=True) detail_category = serializers.StringRelatedField() class Meta: model = ProductDetailModel - fields = "__all__" + exclude = ['name'] class AttributeTypeSerialzier(serializers.ModelSerializer):