После обновления и редактирования добавленного продукта будет сгенерирована еще одна новая страница сведений, но исходная измененная страница не была обновлена

#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-по умолчанию’ значение=’Создать сообщение’ /></кнопка> </форма>