我是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
后应该实现):
请任何帮助。感谢
答案 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