Обновление одного объекта из базы данных - Django / Python - PullRequest
0 голосов
/ 08 апреля 2020

Поэтому я пытаюсь разрешить пользователям редактировать цены пунктов меню, которые в настоящее время находятся в базе данных. Поля автоматически заполнят данные на странице, и пользователи смогут редактировать эти данные, чтобы изменить цену. Вот что у меня есть. Я пробовал и задавал много вопросов, но я все еще потерян. Я много гуглил, и это помогло мне немного понять формы, но я не могу это исправить. Пожалуйста, дайте мне знать, если вам нужно больше информации.

Views.py:

def edit_menu(request):

    queryset = Product.objects.all()
    context = { "object_list": queryset }


    if request.method == 'POST':

        post=ProductModelForm(request.POST)
        if request.POST.get('price') and request.POST.get('name'):
            if 'name' == Product.name:
                post.name= request.POST.get('name')
                post.price= request.POST.get('price')
                post.save()

                return redirect('Edit Menu Item')
            else: 
                return redirect('Edit Menu Item')
        else:
            return render(request, 'mis446/edit-menu-item.html', context)
    else:

        return render(request, 'mis446/edit-menu-item.html', context)

forms.py:

class ProductModelForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name','price'] # specify which field you need to be in the form

HTML:

<title>ACRMS - Edit Menu Price</title>
<div class = "container">
    <form action = "" method = 'POST'>
        {% csrf_token %}

         {% for instance in object_list %}

<input name = "name" value = "{{ instance.name }}"></input>
<input type="number" name="price" value = "{{ instance.price }}"/><br>
 {% endfor %}

    </select>


<button type ="submit">Submit Changes</button>
    </form>

</div>

Urls.py:

 url('edit-menu/edit/',views.edit_menu, name='Edit Menu Item'),

models.py:

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.IntegerField()
    slug = models.SlugField()


    def __str__(self):
        return self.name        

1 Ответ

0 голосов
/ 08 апреля 2020

Для текущей реализации вам не нужна форма. Вместо этого обновите представление следующим образом:

# view
def edit_single_menu(request, pk):
   if request.method == 'POST':

    post=Product.objects.get(pk=pk)
    if request.POST.get('price') and request.POST.get('name'):
        post.name= request.POST.get('name')
        post.price= request.POST.get('price')
        post.save()
        return redirect('Edit Menu Item')
     else: 
        return redirect('Edit Menu Item')


   return render(request, 'mis446/edit-menu-item.html', context)

# url
url('edit-menu/edit/<pk:id>/',views.edit_single_menu, name='edit_single_menu'),


# template (mis446/edit-menu-item.html)

<title>ACRMS - Edit Menu Price</title>
<div class = "container">
{% for instance in object_list %}
<form action = "{% url 'edit_single_menu' instance.pk %}" method = 'POST'>
    {% csrf_token %}
    <input name = "name" value = "{{ instance.name }}"></input>
    <input type="number" name="price" value = "{{ instance.price }}"/><br>  
    <button type ="submit">Submit Changes</button>
</form>
{% endfor %}
</div>

Здесь я отправляю отдельное редактирование в новое отдельное представление с именем edit_single_menu и сохраняю там изменения.

Обновление

Новый URL не предназначен для замены старого. Это только для того, чтобы помочь вам обновить отдельный продукт. Итак, вам нужно сохранить оба URL-адреса. Кроме того, вот ответ, основанный на предложении @ brunodesthuilliers:

# view
def edit_single_menu(request, pk):
   if request.method == 'POST':
      post=Product.objects.get(pk=pk)
      form = ProductForm(request.POST, instance=post)
      if form.is_valid():
         form.save()
   return redirect('Edit Menu Item')

Также внесите некоторые изменения в представление edit_menu:

def edit_menu(request):
    queryset = Product.objects.all()
    context = { "object_list": queryset }
    return render(request, 'mis446/edit-menu-item.html', context)

И URL должны выглядеть следующим образом:

from django.urls import include, path

# rest of the code

path('edit-menu/edit/<int:pk>/',views.edit_single_menu, name='edit_single_menu'),
path('edit-menu/edit/',views.edit_menu, name='Edit Menu Item'),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...