2016-02-19 13 views
0

пытаясь выполнить довольно простой цепной выбор, следующий this example. Это был самый подходящий пример, который я мог найти для своих ограниченных требований, и решил, что ему нужно только переименование в соответствии с моей настройкой.django прикованный select box

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> 

Первая выберите поле показывает категорию/подкатегорию работает, как ожидалось, однако второй флажок выбора остается пустым, независимо от выбранной подкатегории.

Нет ошибок, которые я могу видеть, и не знаю, как отладить это.

Я предполагаю, что приведенный ниже пример - прекрасное рабочее решение, и я подозреваю, что проблема находится где-то в моей схеме именования, например. я смешал подкатегорию и sub_category где-то в ссылке на мой иностранный ключ? , но я, возможно, ошибаюсь,

очень обязан!

EDIT:

нашли ошибку в моем журнале HTTP я могу видеть вызов к/getdetails, что имеет смысл. Однако после добавления/getdetails в urls.py я все еще получаю ошибку 500 в моем HTTP Log

# Browser Page 
urlpatterns += patterns('', 
    (r'^browser/', 'rango.views.category_browser'), 
    (r'^getdetails/', 'rango.views.getdetails'), 
) 

ответ

0

извините, чтобы ответить на мой вопрос пост так быстро,

добавление/getdetails к url.py решает часть проблемы, это не упоминалось в первоначальном примере.

# Browser Page 
urlpatterns += patterns('', 
    (r'^browser/', 'rango.views.category_browser'), 
    (r'^getdetails/', 'rango.views.getdetails'), 
) 

и удалить из views.py

mimetype='application/json', 

как это амортизируется в Джанго 1.7, кажется