【问题标题】:Update a single object from a database - Django/Python从数据库更新单个对象 - Django/Python
【发布时间】:2020-07-20 10:15:10
【问题描述】:

所以我试图允许用户编辑当前数据库中的菜单项价格。这些字段将自动将数据填充到页面中,用户将能够编辑该数据以更改价格。这就是我所拥有的。我已经尝试过并提出了很多问题,但我仍然迷失了方向。我用谷歌搜索了很多,它帮助我理解了一些表格,但我无法修复它。如果您需要更多信息,请告诉我。

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>

网址.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        

【问题讨论】:

标签: python html django web-applications


【解决方案1】:

对于您当前的实现,您不需要表单。相反,像这样更新视图:

# 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 的新分离视图,并将更改存储在那里。

更新

新网址并不是要取代旧网址。它只是为了帮助您更新个别产品。因此,您需要保留这两个网址。此外,这是基于@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)

网址应该是这样的:

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'),

【讨论】:

  • 感谢您的回复。该网址应该替换我在问题中提出的那个还是在它之后?我两种方式都做了,但收到了错误。当我更换它时,它给了我一个 404 错误。然后与他们两个,它说旧网址没有 pk 参数
  • 错误答案。您有一个 ModelForm,使用它,这就是它的用途 - 向您的数据库提交未经验证的未经处理的用户输入是完全不安全的。
  • 我同意,我已经更新了我的答案@brunodesthuilliers
  • @i.s.2951 请看答案的更新部分
  • @ruddra 确实更好!-)
猜你喜欢
  • 2011-05-21
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
相关资源
最近更新 更多