1

我是 django 新手。

我有这个模型:

class Item(models.Model):
    name = models.CharField(max_length=255)
    quantity = models.IntegerField()

如何创建视图以更新我所有项目的数量?

意见:

def item_list(request):
    item = Product.objects.all()[:6]
    return render_to_response('item.html',{'item':item},context_instance=RequestContext(request))

形式:

from django import forms

class QuantityForm(forms.Form):
    quan = forms.IntegerField()

模板:

{% for i in item %}
    {{ i.name }}
    {{ i.quantity }}
{% endfor %}

我正在尝试做这样的事情(quantity在我的模型中单击“更新”值后应该实现):

在此处输入图像描述

请任何帮助。谢谢

4

3 回答 3

3

首先,您需要一个视图,该视图检索项目 ID 和数量值,更新相关Item实例并将您重定向回页面。这是一个例子:

from django.views.decorators.http import require_http_methods
from django.shortcuts import redirect, get_object_or_404

@require_http_methods(["POST"])
def update_item(request)
    id = request.POST.get('id', None) #retrieve id
    quantity = request.POST.get('q', None)  #retrieve quantity
    item = get_object_or_404(Item, id=id) #if no item found raise page not found
    if quantity:
        #updating item quantity
        item.quantity = quantity
        item.save()

    return redirect('my-item-list-view-name')

您还需要为urls.py. 例如:

...
url(r'^update-item/$', 'update_item', name='update_item'),
...

然后您可以为模板上的每个项目制作一个表单:

{% for i in item %}
    <form action="{% url 'update_item' %}" method="post">
        {% csrf_token %}
        {{ i.name }}
        <input name="id" type="hidden" value="{{ i.id }}" />
        <input name="q" type="text" value="{{ i.quantity }}" />
        <input type="submit" value="update" />
    </form>
{% endfor %}

我试图提供一个尽可能简单的解决方案。你应该知道 django 提供了很多很酷的东西,可以帮助你更有效地解决你的问题,例如表单、模型表单、表单集......

于 2012-10-10T19:23:29.290 回答
2

views.py

   if request.method=='POST':
      if 'txt1' in request.POST:
         if request.POST['txt1']!='':
            obj=Item.objects.get(pk=request.POST['item1'])
            obj.quantity=request.POST['txt1']
            obj.save()
      if 'txt2' in request.POST:
         if request.POST['txt2']!='':
            obj=Item.objects.get(pk=request.POST['item2'])
            obj.quantity=request.POST['txt2']
            obj.save()
      if 'txt3' in request.POST:
         if request.POST['txt3']!='':
            obj=Item.objects.get(pk=request.POST['item3'])
            obj.quantity=request.POST['txt3']
            obj.save()
      #continue this code for all 6 items

更新:

当然你可以把它放在一个循环中:

for i in range(1,6):
   if 'txt'+str(i) in request.POST:
      if request.POST['txt'+str(i)]!='':
         obj=Item.objects.get(pk=request.POST['item'+str(i)]
         obj.quantity=request.POST['txt'+str(i)]
         obj.save()

template

<form method='POST' action=''>
{% for i in item %}

      {{ i.name }}:<input type='text' id='txt{{forloop.counter}}' value='{{ i.quantity }}' /><input type='hidden' id='item{{forloop.counter}}' value='{{item.pk}}' /><input type='submit' value='increase' id='sbm{{forloop.counter}}' />

{% endfor %}
</form>

更新: forloop.counter是计数器的电流,1,2,3...

于 2012-10-10T17:56:46.710 回答
2

您可以为您创建一个ModelFormitem然后使用Formsets,或者如果您可以使用 jquery 将 ajax 请求提交到 django 视图,该视图会更新所选模型的项目

$('<yourbuttonclass').onClick(function(e){
    e.preventdefault()
    $.post(urlToPost, dataFromTextField&csrfmiddlewaretken={{csrf_token}})
     .success('Successfully Updated')
     ....

In your view:

#Get the item id from urlconf
@ajax_request
def update_view(request, item_id)
   #Update your item
   return {'Success': 'Updated to blah'}

我喜欢使用这里ajax_request的装饰器来发送 ajax 响应。您也可以发送一个HTTPResponse('Successfully updated')

如果你想创建一个 Restful 资源也是一个好方法,然后你会得到一个接口来从单个模式中创建、更新、读取和删除。阅读Django Tastypie

于 2012-10-10T17:59:33.930 回答