繁体   English   中英

从数据库更新单个 object - Django/Python

[英]Update a single object from a database - Django/Python

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

视图.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'),

模型.py:

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


    def __str__(self):
        return self.name        

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM