在Django中更新表单。怎么设计?

时间:2012-10-10 15:45:54

标签: django

我是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后应该实现):

enter image description here

请任何帮助。感谢

3 个答案:

答案 0 :(得分: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中的视图创建urlpattern。例如:

...
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提供了很多很酷的东西,可以帮助您更有效地解决问题,例如表单,模型,表单等......

答案 1 :(得分: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 ......

答案 2 :(得分:2)

您可以为item创建ModelForm,然后使用Formsets,或者如果您可以使用jquery向django视图提交ajax请求,该视图会更新所选项目模型

$('<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'}

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

如果您想创建Restful资源也是一个很好的方式,然后您可以从单个模式获得创建,更新,读取和删除的界面。阅读Django Tastypie