Невозможно сохранить и удержать выбранный вариант в выпадающем списке
Я выполняю CRUD с использованием внешних ключей и сериализаторов, и у меня возникают трудности при выполнении операции обновления.
Проблема в том, что я не могу сохранить выбранный вариант в выпадающем списке.
Например, в столбце категорий я выбрал 'Bridal wear', а когда я пытаюсь отредактировать его, на странице редактирования сохраненное значение отображается как '9-6wear', как показано ниже.
на следующих изображениях выбранные категории - 9-6wear
ниже представлены модели и сериализаторы
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
, то представление не имеет возможности узнать, что вы выбрали.