Django цепочка выбора
Пытаясь выполнить довольно простой цепочки выбора, следуя этому примеру. это был наиболее подходящий пример, который я мог найти для своих ограниченных требований, и полагал, что ему нужно только переименовать, чтобы соответствовать моим настройкам.
models.py
class Category(models.Model):
"""Category"""
name = models.CharField(max_length=50)
slug = models.SlugField()
def save(self, *args, **kwargs):
# Uncomment if you don't want the slug to change every time the name changes
#if self.id is None:
#self.slug = slugify(self.name)
self.slug = slugify(self.name)
super(Category, self).save(*args, **kwargs)
def __unicode__(self):
return self.name
# return u'%s' % (self.name)
class SubCategory(models.Model):
"""Sub Category"""
category = models.ForeignKey(Category)
name = models.CharField(max_length=50)
slug = models.SlugField()
def save(self, *args, **kwargs):
# Uncomment if you don't want the slug to change every time the name changes
#if self.id is None:
#self.slug = slugify(self.name)
self.slug = slugify(self.name)
super(SubCategory, self).save(*args, **kwargs)
def __unicode__(self):
# return self.name
return u'%s' % (self.name)
class Website(models.Model):
""" service website."""
url = models.URLField(validators=[validate_onion_url], unique=True)
# service
id = models.CharField(primary_key=True, max_length=16,
validators=[MinLengthValidator(16), MaxLengthValidator(16)], unique=True)
#is this domain banned
banned = models.BooleanField(default=False)
#is it online or offline
online = models.BooleanField(default=False)
#echo -e "BLAHBLAHBLAH.onion\c" | md5sum
#hashlib.md5(url[8:-1]).hexdigest()
md5 = models.CharField(max_length=32,
validators=[MinLengthValidator(32), MaxLengthValidator(32)], unique=True)
updated = models.DateTimeField(auto_now=True, auto_now_add=True)
sub_categories = models.ForeignKey(SubCategory, default=1)
referral = models.TextField(blank=True)
class Meta:
"""Meta class."""
app_label = 'ahmia'
def __unicode__(self):
# return self.url
return u'%s' % (self.url)
и views.py
@require_GET
def category_browser(request):
"""Browser Page"""
categories = Category.objects.all().prefetch_related('subcategory_set')
subcategories = SubCategory.objects.filter(category=categories)
return render(request, 'browser.html', {'categories': categories, 'subcategories': subcategories)
def getdetails(request):
#country_name = request.POST['country_name']
subcategory_name = request.GET['cnt']
print "ajax subcategory_name ", subcategory_name
result_set = []
all_websites = []
answer = str(subcategory_name[1:-1])
selected_subcategory = SubCategory.objects.get(name=answer)
print "selected subcategory name ", selected_subcategory
all_websites = selected_subcategory.website_set.all()
for website in all_websites:
print "website name", website.url
result_set.append({'name': website.url})
return HttpResponse(simplejson.dumps(result_set), mimetype='application/json', content_type='application/json')
и HTML-шаблон
<html>
<head>
<script type="text/javascript" src="/static/js/jquery-latest.min.js"></script>
<script type="text/javascript" src="/static/js/script.js"></script>
<script>
$(document).ready(function(){
$('select#selectsubcategories').change(function () {
var optionSelected = $(this).find("option:selected");
var valueSelected = optionSelected.val();
var subcategory_name = optionSelected.text();
data = {'cnt' : subcategory_name };
ajax('/getdetails',data,function(result){
console.log(result);
$("#selectwebsites option").remove();
for (var i = result.length - 1; i >= 0; i--) {
$("#selectwebsites").append('<option>'+ result[i].url +'</option>');
};
});
});
});
</script>
</head>
<body>
<select name="selectsubcategories" id="selectsubcategories">
<option value="" selected="selected">Select Category</option>
{% for category in categories %}
<optgroup label="{{ category.name }}">
{% for item in category.subcategory_set.all %}
<option val="{{ item.name }}"> {{ item.name }} </option>
{% endfor %}
</optgroup>
{% endfor %}
</select>
<select name ="selectwebsites" id="selectwebsites">
</select>
</body>
</html>
Первое поле выбора, показывающее категорию / подкатегорию, работает должным образом, однако второе поле выбора остается пустым независимо от выбранной подкатегории.
Нет ошибок, которые я вижу, и не знаю, как это отладить.
Я предполагаю, что приведенный пример - это прекрасно работающее решение, и я подозреваю, что проблема где-то в моей схеме именования, например, я где-то путаю подкатегорию и подкатегорию в обращении к моей внешней клавише? но я могу ошибаться,
Весьма признателен!
РЕДАКТИРОВАТЬ:
обнаружил ошибку, в моем http журнале я вижу, что сделан вызов / getdetails, это имеет смысл. Однако после добавления / getdetails в urls.py я все еще получаю ошибку 500 в моем http-журнале
# Browser Page
urlpatterns += patterns('',
(r'^browser/', 'rango.views.category_browser'),
(r'^getdetails/', 'rango.views.getdetails'),
)
1 ответ
Извините, что так быстро ответил на мой вопрос,
добавление /getdetails в url.py решает часть проблемы, это не упоминалось в исходном примере.
# Browser Page
urlpatterns += patterns('',
(r'^browser/', 'rango.views.category_browser'),
(r'^getdetails/', 'rango.views.getdetails'),
)
и удалить из views.py
mimetype='application/json',
как это обесценивается в Django 1.7 кажется