Невозможно сохранить и удержать выбранный вариант в выпадающем списке

Я выполняю CRUD с использованием внешних ключей и сериализаторов, и у меня возникают трудности при выполнении операции обновления.

Проблема в том, что я не могу сохранить выбранный вариант в выпадающем списке. Например, в столбце категорий я выбрал 'Bridal wear', а когда я пытаюсь отредактировать его, на странице редактирования сохраненное значение отображается как '9-6wear', как показано ниже. categories here is Bridal Wear на следующих изображениях выбранные категории - 9-6wear but in edit page it shows as 9-6wear instead of bridal wear ниже представлены модели и сериализаторы

class CategoriesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Categories
        fields = "__all__"
        extra_kwargs = {'category_name': {'required': False}}


class ColorsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Colors
        fields = "__all__"

class POLLSerializer(serializers.ModelSerializer):
    # categories = serializers.StringRelatedField(many=False)
    # sub_categories = serializers.StringRelatedField(many=False)
    # color = serializers.StringRelatedField(many=False)
    # size = serializers.StringRelatedField(many=False)
    class Meta:
        model = Products
        fields = "__all__"


class SizeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Size
        fields = "__all__"


class SUBCategoriesSerializer(serializers.ModelSerializer):
    class Meta:
        model = SUBCategories
        fields = "__all__"
models

class Products(models.Model):
    categories = models.ForeignKey(Categories,on_delete=models.CASCADE)
    sub_categories = models.ForeignKey(SUBCategories,on_delete=models.CASCADE)
    color = models.ForeignKey(Colors,on_delete=models.CASCADE)
    size = models.ForeignKey(Size,on_delete=models.CASCADE)
    # image = models.ImageField(upload_to = 'media/',width_field=None,height_field=None,null=True)
    title = models.CharField(max_length=50)
    price = models.CharField(max_length=10)
    sku_number = models.CharField(max_length=10)
    product_details = models.CharField(max_length=300)
    quantity = models.IntegerField(default=0)
    isactive = models.BooleanField(default=True)

class Categories(models.Model):
    #made changes to category_name for null and blank
    category_name = models.CharField(max_length=20)
    category_description = models.CharField(max_length=20)
    isactive = models.BooleanField(default=True)
    
    def __str__(self):
        return self.category_name
class Colors(models.Model):
    color_name = models.CharField(max_length=10)
    color_description = models.CharField(max_length=10)
    isactive = models.BooleanField(default=True)

    def __str__(self):
        return self.color_name
class Size(models.Model):
    size_name = models.CharField(max_length=10)
    size_description = models.CharField(max_length=20)
    isactive = models.BooleanField(default=True)

    def __str__(self):
        return self.size_name
class SUBCategories(models.Model):
    category_name = models.ForeignKey(Categories, on_delete=models.CASCADE)
    sub_categories_name = models.CharField(max_length=20)
    sub_categories_description = models.CharField(max_length=20)
    isactive = models.BooleanField(default=True)

    def __str__(self):
        return self.sub_categories_name

функция редактирования

def update(request,id):
    if request.method == 'GET':
        print('GET',id)
        editclothes = Products.objects.filter(id=id).first()
        s= POLLSerializer(editclothes)
        category_dict = Categories.objects.filter(isactive=True)
        category = CategoriesSerializer(category_dict, many=True)
        sub_category_dict = SUBCategories.objects.filter(isactive=True)
        sub_category = SUBCategoriesSerializer(sub_category_dict,many=True)
        color_dict = Colors.objects.filter(isactive=True)
        color = ColorsSerializer(color_dict,many=True)
        size_dict = Size.objects.filter(isactive=True)
        size = SizeSerializer(size_dict,many=True)
        hm = {"context": category.data,"sub_context":sub_category.data,"color_context":color.data,"size_context":size.data,"Products":s.data}
        return render(request, "polls/product_edit.html", hm)
 
    else:
        print('POST',id)
        editclothes = {}        
        d = Products.objects.filter(id=id).first()
        if d:
            editclothes['categories']=request.POST.get('categories')
            editclothes['sub_categories']=request.POST.get('sub_categories')
            editclothes['color']=request.POST.get('color')
            editclothes['size']=request.POST.get('size')
            editclothes['title']=request.POST.get('title')
            editclothes['price']=request.POST.get('price')
            editclothes['sku_number']=request.POST.get('sku_number')
            editclothes['gender']=request.POST.get('gender')
            editclothes['product_details']=request.POST.get('product_details')
            editclothes['quantity']=request.POST.get('quantity')
            print(editclothes)
            form = POLLSerializer(d,data=editclothes)
            if form.is_valid():
                form.save()
                print("data of form",form.data)
                messages.success(request,'Record Updated Successfully...!:)')
                return redirect('polls:show')
            else:
                print(form.errors)
                print("not valid")
                return redirect('polls:show')

редактировать страницу

<td>Categories</td>
<td>
                            
   <input name="categories" id="CATEGORIES" placeholder="enter categories" list="Categories" value="{{Categories.category_name}}">
   <datalist id="Categories">
      {% for c in context %}
          <option value="{{c.id}}">{{c.category_name}}</option>
      {% endfor %}
   </datalist>
 </td>
<td>Sub-Categories</td>

где я ошибаюсь?

Ваш код немного запутан - я думаю, вам лучше использовать формы модели Django, а не сериализаторы (хотя формы по сути являются одним из типов сериализаторов).

https://docs.djangoproject.com/en/4.0/topics/forms/

Например, ваш код представления не будет мучительно извлекать все элементы request.POST, вместо этого он будет делать что-то вроде form = MyForm(request.POST) - остальная часть вашего кода, похоже, даже использует структуру формы для валидации и сохранения, так что вы уже частично на пути к этому.

Использование форм также означает, что ваш шаблон просто становится {{ form }}, если вы не хотите дополнительно настраивать HTML формы - вы можете использовать .as_table или .as_p, что не так уж плохо. Я вижу, что ваш шаблон имеет неопределенный вход, а затем набор данных, на самом деле это должен быть вход <select> с <option> элементами, содержащимися внутри.

Что касается того, почему категория меняется, когда вы нажимаете кнопку редактировать, вы пытаетесь редактировать категорию или что-то другое? Нажатие кнопки редактировать должно отправлять GET-запрос, поэтому, если вы не помещаете выбранную категорию как URL или параметр запроса, например, .../?category=bridal_wear, то представление не имеет возможности узнать, что вы выбрали.

Вернуться на верх