2

それで、2つの依存ドロップダウンを作成する方法についてこれを見つけました。私は例に従いましたが、ドロップダウンメニューを使用してページを読み込もうとすると、次のエラーが発生します。

AttributeError at /brewkeep/beers/
'dict' object has no attribute 'status_code'

これはトレースバックです:

Environment:


Request Method: GET
Request URL: http://192.168.1.111:8080/brewkeep/beers/

Django Version: 1.4
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'brewkeep',
 'django.contrib.admin')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/home/di/djangostack-1.4-1/apps/django/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  188.                 response = middleware_method(request, response)
File "/home/di/djangostack-1.4-1/apps/django/lib/python2.7/site-packages/django/middleware/common.py" in process_response
  94.         if response.status_code == 404:

Exception Type: AttributeError at /brewkeep/beers/
Exception Value: 'dict' object has no attribute 'status_code'

これは私のコードです:

urls.py

(r'^brewkeep/beers/$', 'brewkeep.templatetags.brewery_beer_select'),
(r'^brewkeep/beers/(?P<brewery_id>[-\w]+)/all_json_models/$', 'brewkeep.views.beer_views.show_beers'),

models.py

class Brewery(models.Model):
    idbrewery = models.AutoField(primary_key=True)
    name = models.CharField(max_length=765)
class Beer(models.Model):
    idbeer = models.AutoField(primary_key=True)
    brewery = models.ForeignKey(Brewery, null=True, on_delete=models.SET_NULL)

templatetags.py

from brewkeep.models import Brewery
from django import template

register = template.Library()

@register.inclusion_tag("show_beers.html")
def brewery_beer_select(request):
    breweries = Brewery.objects.all().order_by('name')
    return {'breweries' : breweries}

show_beers.html

<form action="" method="get" accept-charset="utf-8">
    <p>Brewery:</p>
    <select name="brewery" id="brewery">
        <option value="">Select a brewery</option>
        {% for brewery in breweries %}
            <option value="{{brewery.idbrewery}}">{{brewery.name}}</option>
        {% endfor %}    
    </select>
    <select name="beer" id="beer" disabled="true">
        <option>Select a beer</option>
    </select>
</form>
<script src="{{ STATIC_URL }}admin/js/jquery.min.js">
    $(document).ready(
        function() {
            $("select#brewery").change(function() {
                if ($(this).val() == '') {
                    $("select#beer").html("<option>Select a beer</option>");
                    $("select#beer").attr('disabled', true);
                }
                else {
                    var url = "/brewkeep/beers/" + $(this).val() + "/all_json_models";
                    var brewery = $(this).val();
                    $.getJSON(url, function(beers) {
                        var options = '<option value="">Select a beer</option>';
                        for (var i = 0; i < beers.length; i++) {
                            options += '<option value="' + beers[i].pk + '">' + beers[i].fields['description'] + '</option>';
                        }
                        $("select#beer").html(options);
                        $("select#beer option:first").attr('selected', 'selected');
                        $("select#beer").attr('disabled', false);
                    });
                }
            });


            $("select#beer").change(function(vent) {
                if ($(this).val() == '') {
                    return;
                }
            });
        }
    );

</script>

ビール_ビュー.py

def show_beers(request, brewery_id):
    brewery_obj = Brewery.objects.get(idbrewery=brewery_id)
    beers = Beer.objects.all().filter(brewery=brewery_obj).order_by('name')
    json_models = serializers.serialize("json", beers)
    return HttpResponse(json_models, mimetype="application/javascript")

私が見逃しているものはありますか?

ありがとう!

4

2 に答える 2

3

あなたが求めていることをするために、私はdjango-smart-selectsを使うのが好きです。ChainedForeignKey と呼ばれるモデル フィールドを使用してモデルをチェーンする js 機能が含まれています。たとえば、ユーザーが電話の種類、メーカー、モデル (例: Iphone 4 S、Samsung Galaxy 2) を選択できる電話連鎖選択が必要な場合は、次のようになります。

models.py:

from smart_selects.db_fields import ChainedForeignKey

class Series(models.Model):
    series = models.CharField(max_length=10)

class Model(models.Model):
    model = models.CharField(max_length=20)
    series = models.ForeignKey(Series)

class Make(models.Model):
    make = models.CharField(max_length=20)
    model = models.ForeignKey('Model')

class Phone(models.Model):
     make = models.ForeignKey(Make)
     model = ChainedForeignKey(Model, chained_field='make', chained_model_field='make',)
     series = ChainedForeignKey(Series, chained_field='model', chained_model_field='model',)

class PhoneForm(ModelForm):
    class Meta:
        model=Phone

template.html:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>

{% block content %}
  <form action='' method='post' enctype='multipart/form-data'>
  {{ form.as_p }}
  {% csrf_token %}
  <input type='submit' value='submit' />
  </form>
{% endblock %}

編集:コメントに基づく

ドキュメントから

連鎖フィールドは、フィールドも連鎖する必要がある同じモデルのフィールドです。連鎖モデル フィールドは、連鎖フィールドによってリンクされたモデルに対応する連鎖モデルのフィールドです。

に変更しchained_model_field='name'ます。

于 2013-01-05T19:57:27.500 に答える
0

beers_select_options.htmlビール選択のオプション用の簡単なテンプレート を作成します。

<option>Select a beer</option>
    {% for beer in beers %}
        <option value="{{ beer.idbeer }}">{{ beer }}</option>
    {% enfor %}

ビューでそれを提供する

def ajax_get_beers(request):
    idbrewery = int(request.POST['idbrewery'])
    brewery = Brewery.objects.get(idbrewery=idbrewery)
    beers = Beer.objects.filter(brewery=brewery)
    return render_to_response('beers_select.html', {'beers': beers})

次に、醸造所の選択ボックスの変更イベントに関数を添付します -

$('#brewery').change(function() {
    var idbrewery = $(this).find(':selected').val();
    $.ajax({
        type: 'POST',
        url: '/your/ajax_get_beers/view',
        data: {'idbrewery': idbrewery}
        success: function(options_html) {
            $('#beer').html(options_html);
        }
    });
});

おそらくcsrf保護を持っていることを除いて、それでうまくいきます。そのため、javascriptの前に次を追加する必要があります(ドキュメントを参照)-

function csrfSafeMethod(method) {
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

var csrftoken = $.cookie('csrftoken');
$.ajaxSetup({
    crossDomain: false, 
    cache: false,
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type)) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

これにはjquery cookie プラグインが必要です ( django docsに cookie を取得するための代替手段があります)。

私は自分のコードをテストしていませんが、本当に必要なのはそれだけだと思います (ajax ビューの URL conf に追加する必要があると思います)。

于 2013-01-10T08:32:08.403 に答える