Django: пользовательский контент в форме администратора - PullRequest
0 голосов
/ 08 марта 2012

Для одной из моих моделей я хочу показать дополнительный контент в форме change_form.По сути, моя модель выглядит следующим образом:

class News(models.Model):
    ...

class NewsFromSource(models.Model):
    news                    = models.ForeignKey(News)
    ...

Я хочу добавить кнопку «Поиск», которая при нажатии запускает запрос веб-службы к внешнему источнику новостей, опускает доступный контент и выводит списки.все новости содержали.Затем пользователь может выбрать один из фрагментов, чтобы «прикрепить» его к новостям, которые в данный момент редактируются в интерфейсе администратора (т. Е. Создать новый источник NewsFromSource на основе содержимого, загруженного через веб-службу).

Я закончилвеб-сервис.Каков наилучший подход к реализации кнопки поиска, отображения списка для результатов (у меня есть работающий вид и шаблон, нужно как-то получить их в форме) и сохраняющая часть?

Ответы [ 2 ]

1 голос
/ 09 марта 2012

В итоге я сделал следующее:

1)

Я создал представление для поиска результатов поиска, которое сводится к следующему:

#/myproject/admin/views.py
@never_cache
def news_search(request):

    #...query web service
    if 'q' in request.POST:
        search_term = request.POST['q']
    else:
        search_term = ''

    news = NewsSearch()
    news.search(search_term)

    return render_to_response(  'news_search_results.html', 
                            {   'q':            search_term,
                                'news':     news.result_list,
                                'page':         page,
                                'page_left':    news.page_left, 
                                'page_right':   news.page_right}
                                )  

2) Я отобразил представление:

#/myapp/urls.py
...
url(r'^myapp/news/search/$', views.news_search),

3) Я расширил файл change_form.html для модели новостей следующим кодом:

#/myproject/templates/admin/myapp/news/change_form.html
    {% extends "admin/change_form.html" %}
    {% block after_field_sets %}
    ...
    {% csrf_token %}
    <input type="text" name="q" id="news-search-term">
    <div id="news-search-results"></div>
   ...
    function submitSearchForm() {
    $.post("/myapp/news/search/",
        {   'q': $('#news-search-term').val(),
            'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val() },
        function(data){
            $('#news-search-results').html(data);
        } 
    );
}
    {{ block.super }}
    {% endblock %}

4) Я создал шаблон HTML для отображениярезультаты (news_search_results.html, см. 1)

Итак, в основном я отправляю запрос AJAX со страницы администратора в пользовательское представление для получения результатов из веб-службы, которые затем отображаются в div.1017 * У каждого элемента в списке результатов есть кнопка, которая отправляет еще один запрос, в котором хранится элемент с идентификатором новости как ForeignKey.

Я не знаю, особенно ли это противоречит принципам Джанго.Но, похоже, все в порядке.

Предложения о том, как сделать это более "джангонским" способом, приветствуются.

0 голосов
/ 08 марта 2012
  1. Предположим, у вас есть связанная новостная модель . Добавьте это поле к raw_id_fields моделадмина, которого мы собираемся взломать, затем:

  2. Перегрузка шаблона change_form для этой модели , расширение admin/change_form.html в admin/yourapp/yourmodel/change_form.html

  3. Добавить javascript в этот шаблон к:

    1. Скрыть значок ввода и лупы из поля необработанного идентификатора новостей raw, вы также можете сделать это в css

    2. Добавить что-то вроде диапазона со стилем кнопки в этой строке формы, которая будет открывать всплывающее окно при нажатии

    3. В открывшемся всплывающем окне должен быть ваш рабочий вид / шаблон с формой для выбора новостей

    4. Когда пользователь выбирает новость, всплывающее окно должно выполнить запрос на публикацию ajax, чтобы получить идентификатор новости, и закрыть себя

    5. значение установлено на скрытый ввод необработанного поля id, это довольно сложно, но не бойтесь, что кто-то (дисклеймер: I) опубликовал статью со всеми техническими подробностями , также найденную еще один, но я его не проверял

Это будет довольно трудоемко. Терпение и настойчивость будут вашими лучшими качествами для этой миссии B)

...