2012-03-08 7 views
0

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

class News(models.Model): 
    ... 

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

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

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

ответ

1

То, что я в конечном итоге делает это следующим образом:

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 от admin на пользовательское представление для получения результатов из веб-службы, которые затем отображаются в div.

В каждом элементе списка результатов есть кнопка, которая отправляет другой запрос, который хранит элемент с идентификатором новостей как ForeignKey.

Я понятия не имею, особенно ли это в отношении принципов Django. Но, похоже, все в порядке.

Предложения по этому вопросу более «Djangonian» приветствуются.

0
  1. Мы предполагаем, что вы связанной модели Новости. Добавьте это поле в raw_id_fields из modeladmin мы собираемся взломать, то:

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

  3. Добавить JavaScript в этом шаблоне до:

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

    2. Добавить что-то вроде шкалы с стиле кнопки в том виде строки, которая откроется всплывающее окно при щелчке

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

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

    5. значения устанавливается в поле сырого ид ввод скрыт, это довольно сложно, но не бойтесь кого-то (d isclamer: I) опубликовал an article with the whole technical details, также нашли another one but I didn't test it

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

+0

Извините, я просто понял, что всплывающее окно не сможет «вернуть» json очень легко, поэтому я изменил свой совет – jpic

+0

У меня возникли проблемы с доступом к ссылке ... – Yann

+0

Спасибо за ваши отзывы, оказалось, что у меня был взломать файл моих хостов ... обновил ссылку – jpic

Смежные вопросы