1

私はジャンゴ初心者です。

私はこのモデルを持っています:

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

また、ビューの urlpattern を で作成する必要があります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

ModelFormを作成してFormsetsitemを使用するか、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 に答える
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

アップデート:

もちろん、U はこれをループに入れることができます:

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 に答える