Ajax форма Django, зависимость от полей выбора - PullRequest
2 голосов
/ 24 марта 2011

models.py

class Book(models.Model):
    title = models.CharField()
    genre = models.ManyToManyField(Genre)

class Genre(models.Model):
    name = models.Charfield()

class ReadBook(models.Model):
    genre = models.ForeignKey(Genre)
    books = models.ManyToManyField(Book)

Также у меня есть один ModelForm:

class ReadBookForm(ModelForm):
    class Meta:
        model = ReadBook

template.html

<form action="/add_report/" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit" />
</form>

Цель: По умолчанию для показа посетителю доступно только одно поле - жанр. Когда он сделает этот выбор - покажите другие поля из модели книги, связанные с выбранным жанром.

1 Ответ

2 голосов
/ 24 марта 2011

тег внутренней формы:

{{ form.genre }}
<div id="books"></div>
<input type="submit" value="Submit" disabled="yes" />

тогда в javascript (jQuery отлично подходит для этого материала):

$('#{{ form.genre.id }}').change(function(){
    $('#books').load('{% url get_genre_books %}', {genre: $(this).value()})
});

Вы должны создать представление, которое будет возвращать HTML, который должен быть помещен в этот div:

def get_genre_books(request):
    genre = get_object_or_404(pk=request.GET.get('genre', None))
    # here render a template or something that shouls be multiple selector of the books)
    resp = ", ".join(genre.book_set.values_list('title', flat=True))
    return HttpResponse(resp)

и, конечно, добавить это представление в urls.py.

Одно из многих решений :) не проверял его (написано только здесь, так что, возможно, небольшие ошибки где-то):)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...