Обновление не сохраняется в django rest framework
views.py
def productslist(request):
products = Products.objects.all()
context = {'products':products}
return render(request,'productslist.html',context)
def productsform(request):
return render(request,'productscreate.html')
def productsupdate(request):
return render(request,'productsupdate.html')
def productsAdd(request):
if request.method == "POST":
data = request.data
product = Products()
product.title = request.POST["title"]
product.description = request.POST["description"]
product.image = request.FILES.get("image")
product = Products(title=data['title'], description=data['description'], image=data['image'])
product.save()
serializer = Productserialize(product)
return Response(serializer.data)
def products_list(request):
if (request.method == 'GET'):
product = Products.objects.all()
serializer = Productserialize(product,many=True)
return Response(serializer.data)
class ProductsDetailView(DetailView):
template_name = "productsdetail.html"
queryset = Products.objects.all()
context_object_name = 'products'
model = Products
serializer_class = Productserialize
@api_view(['PUT'])
def productupdate(request,pk):
data = request.data
prod = Products.objects.get(id=pk)
serializer = Productserialize(prod,data=data, many=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
detail.html
<form>
Title:- {{products.title }} <br><br>
Description:- {{ products.description}}<br><br>
{% if products.image %}
Image :- <img src="{{products.image.url}}" alt="image"><br><br>
{% endif %}
<button><a href="/update/{{ products.id}}">Edit</a></button>
</form>
serializer.py
class Productserialize(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
title = serializers.CharField(required=False, allow_blank=True, max_length=100)
description = serializers.CharField(required=False, allow_blank=True, max_length=100)
image = serializers.FileField()
def create(self, validated_data):
"""
Create and return a new `Snippet` instance, given the validated data.
"""
return Products.objects.create(**validated_data)
def update(self, instance, validated_data):
"""
Update and return an existing `Snippet` instance, given the validated data.
"""
instance.id = validated_data.get('id', instance.id)
instance.title = validated_data.get('title', instance.title)
instance.description = validated_data.get('description', instance.description)
instance.image = validated_data.get('image', instance.image)
instance.save()
return instance
update.html
<form method="post" action="/update/{{prod.id}}" enctype="multipart/form-data">
{% csrf_token %}
<table>
<tr>
<td>Title:<br>
<input type="text" name="title" id="title" value="{{ prod.title }}"></td>
<br>
</tr>
<tr>
<td>Description:<br>
<textarea name="description" id="description" value="{{ prod.description }}">Description</textarea></td>
<br>
</tr>
<tr>
{% if prod.image %}
<td>Image:<br>
<input type="file" name="image" id="image" value="{{prod.image.url}}"></td>
{% endif %}
<br>
</tr>
<tr>
<td><button type="submit" id="update">Update</button></td>
</tr>
</table>
</form>
urls.py
urlpatterns = [
path('', views.index, name="index"),
path('productlist', views.login, name="login"),
path('productslist', views.productslist, name='productslist'),
path('productscreate',views.productsform,name='productscreate'),
path('productsadd', views.productsAdd, name="productsadd"),
path('api/', views.products_list, name="products_list"),
path('<int:pk>', ProductsDetailView.as_view(), name='productsdetail'),
path('update', views.productsupdate, name="productsupdate"),
path('update/<str:pk>', views.productupdate, name="productupdate"),
]
Update не сохраняет данные в rest framework Я не знаю, в чем проблема
Когда я пытаюсь обновить форму, данные не сохраняются в базе данных и не отображаются в api Я предоставил html, views и urls.py Мне нужно обновить форму с помощью html-формы и отобразить данные в api. Пожалуйста, помогите мне решить эту проблему Заранее спасибо
Похоже, что вы обновляете один объект. Именно поэтому вы берете pk из url. Поэтому самое первое изменение, которое вам нужно здесь, это .
@api_view(['PUT'])
def productupdate(request,pk):
data = request.data
prod = Products.objects.get(id=pk)
serializer = Productserialize(prod,data=data, many=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
измените many=True
на many=False
.
и вы также можете прокомментировать .
def update(self, instance, validated_data):
"""
Update and return an existing `Snippet` instance, given the validated data.
"""
instance.id = validated_data.get('id', instance.id)
instance.title = validated_data.get('title', instance.title)
instance.description = validated_data.get('description', instance.description)
instance.image = validated_data.get('image', instance.image)
instance.save()
return instance
из вашего сериализатора. Потому что ваши представления уже обрабатывают эту логику обновления...