#python #django
#python #django
Вопрос:
Python 3.8.3
Django 2.2
asgiref 3.3.1
djangorestframework 3.11.1
Pillow 7.2.0
pip 19.2.3
psycopg2 2.8.6
pytz 2020.1
setuptools 41.2.0
sqlparse 0.3.1
Могу ли я спросить великого бога,
Недавно добавленный объект product необходимо отредактировать, но после редактирования он становится еще одним дополнением.
Например:
Введите товар 3, отредактируйте содержимое и нажмите «Подтвердить редактирование». Исходный элемент имеет номер элемента 3 и мгновенно становится элементом № 4. После каждого редактирования или обновления он станет новой страницей продукта. Что такое программная часть? Есть ли ошибка?
Добавить еще раз: изначально хотел отредактировать эту страницу http://127.0.0.1:8001/store/107/(id=107)
, после редактирования и архивирования всплывающая страница представляет собой новую страницу с идентификатором id = 111. http://127.0.0.1:8001/store/111/ (id=111)
Но я вхожу в admin http://127.0.0.1:8001/admin/store/product/111/change/
после изменения, проблем нет, и вы можете редактировать его. Эта ошибка появляется только на экране моей недавно созданной формы.
Найдите решение: в Интернете есть похожая программа «редактирования». Метод записи аналогичен тому, что я написал, но я не могу редактировать продукт с id = 107. Как я могу это решить?
urls.py
path('<int:id>/edit/', views.productUpdate, name='edit'),
views.py
def productUpdate(request, id=None):
# basic use permissions 基本使用權限
if not request.user.is_staff or not request.user.is_superuser:
raise Http404
instance = get_object_or_404(Product, id=id)
form = ProductForms(request.POST or None, instance=instance)
if form.is_valid():
instance = form.save(commit=False)
instance.save()
# message success
messages.success(request, "<a href='#'>Item</a> Saved", extra_tags='html_safe')
return HttpResponseRedirect(instance.get_absolute_url())
# 購物車購買數量
data = cartData(request)
cartItems = data['cartItems']
context = {
'instance': instance,
'form': form,
'cartItems': cartItems,
}
return render(request, 'store/form.html', context)
models.py
class Product(models.Model):
name = models.CharField(max_length=200)
content = models.TextField(default='')
price = models.DecimalField(max_digits=7, decimal_places=2)
digital = models.BooleanField(default=False, null=True, blank=True)
image = models.ImageField(
upload_to=imgs,
null=True,
blank=True,
width_field="width_field",
height_field="height_field"
)
height_field = models.IntegerField(default=0)
width_field = models.IntegerField(default=0)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
timestamp = models.DateTimeField(auto_now=True, auto_now_add=False)
def __unicode__(self):
return self.name
def __str__(self):
return self.name
@property
def imageURL(self):
try:
url = self.image.url
except:
url = ''
return url
def get_absolute_url(self):
return reverse('store:detail', kwargs={'id': self.id})
class Meta:
ordering = ["-timestamp", "-updated"]
form.html
{% extends "store/main.html" %}
{% block content %}
<div class="container">
<div class="row pt-5">
<div class='col-sm-6 pt-5'>
<a href="{% url 'store:store' %}" class="pt-5 text-danger bg-dark text-decoration-none">返回首頁</a>
</div>
</div>
<div class="row">
<div class='col-sm-6'>
<h1>Form</h1>
<form method='post' action='{% url 'store:create' %}' enctype='multipart/form-data'>{% csrf_token %}
{{ form.as_p }}
<button><input type='submit' class='btn btn-default' value='Create Post'/></button>
</form>
</div>
</div>
</div>
{% endblock content %}
detail.html
<div class='col-sm-6 col-sm-offset-3'>
<a href="{% url 'store:edit' id=instance.id %}">Edit/update Product</a><br>
<a href="{% url 'store:delete' id=instance.id %}">Del Product</a><br>
{# <a href="{% url 'store:list' %}">Product</a><br>#}
</div>
Важное замечание, поскольку это не сообщение об ошибке, ни ide, ни веб-страница не предоставляют никаких сообщений об ошибках, поэтому они не прикреплены.
Начинающий практикующий завершите проект: https://github.com/georgiawang5332/libshopapp
пожалуйста, помогите мне, спасибо!!!
Комментарии:
1. paste.ubuntu.com/p/jSDpSGpF5c **** Нажмите на ссылку, чтобы увидеть больше views.py информация о коде *** Прошу прощения за беспокойство. Я не знаю, как изменить содержимое stackoverflow . Я прикреплю эту ссылку для вашего удобства. Спасибо.
2. Фактически, на моем экране нет отчета об ошибках. Редактирование (обновлено) также стало ролью create и добавило еще один новый объект product. В результате я не могу найти проблему. Возврата к ошибке нет. Я не знаю, в чем проблема, я также разместил практический проект на github.
Ответ №1:
Проблема в том, что вы создаете новый объект вместо обновления существующего: надеюсь, это решит вашу проблему.
def productUpdate(request, id=None):
# basic use permissions 基本使用權限
if not request.user.is_staff or not request.user.is_superuser:
raise Http404
context = {}
if request.POST:
form = ProductForms(request.POST)
if form.is_valid():
instance = get_object_or_404(Product, id=id)
form = ProductForms(data=request.POST, instance=instance)
form.save()
# updating our context
context.update({'instance': instance})
# message success
messages.success(request, "<a href='#'>Item</a> Saved",
extra_tags='html_safe')
return HttpResponseRedirect(instance.get_absolute_url())
else:
form = ProductForms() # if request isn't POST we initialize an empty form
data = cartData(request)
cartItems = data['cartItems']
context.update({
'form': form,
'cartItems': cartItems,
})
return render(request, 'store/form.html', context)
Для получения более подробной информации посетите документы modelform от django.
Комментарии:
1. спасибо за ваше объяснение для django… но у меня это тоже неправильно <form method=’post’ action='{% url ‘store:edit’ id=instance.id %}’enctype=’multipart/form-data’>{% csrf_token %} {{ form.as_p }} <кнопка><тип ввода=’отправить’ класс=’btn btn-по умолчанию’ значение=’Создать сообщение’ /></кнопка> </форма>