лучший способ сделать ajax в django

Была свободно связанная проблема здесь , текстовая область с 100% шириной игнорирует родителя element' s ширина в IE7

не знают, находилось ли какое-либо окончательное решение когда-либо, но кажется, что самое близкое было word-break:break-all, который мог бы сделать задание в Интернете Exploder.

я также нашел этот http://petesbloggerama.blogspot.com/2007/02/firefox-ie-word-wrap-word-break-tables.html проложенный под землей в моих закладках, который указывает на работу вокруг для большинства других браузеров, которые могли бы помочь.

CSS3 будет большим, если это когда-нибудь доберется здесь...

Hope, которая помогает, будет интересно видеть то, что Вы придумываете. Извините я не могу предложить ничего протестированного или более определенного.

5
задан Joel 29 September 2009 в 09:59
поделиться

4 ответа

Я думаю, это зависит от того, что вы хотите делать. Ajax представляет собой довольно широкий спектр сценариев, от Google Maps до простого автозаполнения, отличается большой сложностью и лучшим подходом.

Однако есть несколько полезных вещей, которые вы можете сделать, чтобы помочь.

1) Уровень шаблона

Убедитесь, что у вас есть «django.core.context_processors.request» в настройке TEMPLATE_CONTEXT_PROCESSORS. Затем вы можете сделать это:

{% if not request.is_ajax %}
<html>
  <head>
  ...
  </head>
  <body>
  ...
{% endif %}
actual content
{% if not request.is_ajax %}
</body>
</html>
{% endif %}

В общем, тогда скажите, что эта страница / test /, вы можете сделать запрос браузера и получить полный контент или запрос через JavaScript и просто получить контент. Где-то есть пост в блоге, который объясняет это более подробно, но я не могу его найти в данный момент.

2) В представлении

В шаблоне мы просто обращаемся к объекту запроса в шаблоне. В представлении можно делать очень похожие вещи.

def my_view(request):
    if requst.is_ajax():
        # handle for Ajax requests

    # otherwise handle 'normal' requests
    return HttpResponse('Hello world')

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

скажем, например, у вас может быть только один шаблон, и если это Ajax запросить, чтобы он возвращал только тот раздел, который необходимо обновить. В вашем случае это будут представления таблиц.

скажем, например, что у вас может быть только один шаблон, и если это запрос Ajax, он должен возвращать только тот раздел, который необходимо обновить. В вашем случае это будут представления таблиц.

скажем, например, что у вас может быть только один шаблон, и если это запрос Ajax, он возвращает только тот раздел, который необходимо обновить. В вашем случае это будут представления таблиц.

5
ответ дан 13 December 2019 в 05:38
поделиться

Неважно, что , вам понадобятся как минимум две вещи:

  1. Ваш код javascript для вызова (он у вас есть)

  2. Код на стороне сервера для обработать запрос (это ваше представление и url-config)

В этом нет абсолютно ничего "взломанного".

Третье, ваш файл шаблона, является необязательным, но обычно является хорошей практикой. Вы хотите отделить разметку от кода по многим причинам.

Так что я думаю, что вы правильно поняли. Продолжайте.

2
ответ дан 13 December 2019 в 05:38
поделиться

Что именно кажется в этом хакерским? Похоже на вполне допустимый способ что-то сделать.

Думаю, альтернативой была бы сериализация в json и отправка его обратно во фрагмент шаблона javascript.

1
ответ дан 13 December 2019 в 05:38
поделиться

Я довольно поздно, но хочу задокументировать как комбинировать и адаптировать решения, представленные d0ugal в некотором смысле, что это разрешит гораздо более чистый код шаблона.

У меня есть модель, представляющая контактных лиц.

(общее) представление для получения одного ContactPerson выглядит следующим образом:

def contcactperson_detail_view(request, name):
    try:
        person = ContactPerson.objects.get(slug=name)
    except:
       raise Http404
    if request.is_ajax():
        return contcactperson_detail_view_ajax(request, person)
    return list_detail.object_detail(
            request,
            queryset = ContactPerson.objects.all(),
            object_id = person.id,
            template_object_name = "contactperson",
        )

@render_to('cms/contactperson_detail_ajax.html')    
def  contcactperson_detail_view_ajax(request, person):
    return {'contactperson':person, 'is_ajax':True}

Шаблон для визуализации представления, которое обрабатывает один ContactPerson, называется contcactperson_detail_view.html :

{% extends "index.html" %}
{% block textpane %}

<h1 id="mainheader">{{ contactperson.first_name }} {{ contactperson.family_name  }} </h1>
<div class="indentation">&nbsp;</div> 
{% include 'cms/contactperson_detail_photo.html' %}                                                                                                          
<div id="text_pane">

{% include 'cms/contactperson_detail_textpane.html' %}
</div>
{% endblock %}

Он включает два подшаблона

contactperson_detail_textpane.html


<p>{{ contactperson.description }}</p>
<ul>
    <li>
        <dl>
            <dt>Email</dt>
            <dd>
                {{ contactperson.mail }}
            </dd>
        </dl>
    </li>
    <li>
        <dl>
            <dt>Contact Person for</dt>
            <dd>
                <ul>
                {% for c in contactperson.categories.all %}
                    <li><a href="{% url category-view c.slug %}">{{ c }}</a></li>
                {% endfor %}
                </ul>
            </dd>
        </dl>
    </li>
</ul>

и contactperson_detail_photo.html

{% with contactperson.photo.detailphoto as pic %} 
    {% with pic.url as pic_url %}    
    <div {% if not is_ajax %}id='imageContainer'{% endif %} style="float: right;padding-right:0.5em; 
                                    padding-bottom: 1em; padding-left:0.5em;clear:both; 
                                    width:{{ pic.width }}px">   
        <div style="width:{{ pic.width}}px">                       
                <img style="clear:both" src="{{ pic_url }}" alt="{{ i.name }}"/> 
        </div>                                                                                                                    
    </div>   
    {% endwith %}
{% endwith %}

эти 3 шаблона будут использоваться, если запрос не является ajax.

Но если запрос является ajax, contcactperson_detail_view вернет представление contcactperson_detail_view_ajax , который использует шаблон contactperson_detail_ajax.html для рендеринга. И этот шаблон выглядит так:

<h1>{{ contactperson.first_name }} {{ contactperson.family_name  }}</h1>
{% include 'cms/contactperson_detail_photo.html' %}                                                                                                          
{% include 'cms/contactperson_detail_textpane.html' %}

Таким образом, он использует те же подшаблоны, но ничего не расширяет, поэтому доставляется только необходимая разметка. Поскольку представление ajax передает шаблону is_ajax = True , его можно использовать для корректировки незначительных вещей, таких как установка правильных атрибутов идентификатора.

Не требуется контекстный процессор или дополнительная конфигурация URL.

] Наконец, код Javascript:

$("#contact_person_portlet a").click(function(event){
       event.preventDefault();
       $.ajax({
           type: "GET",
           url: event.target.getAttribute('href'),
           success: function(msg){
               overlay(msg);
           }
        });
    });

Надеюсь, что это будет полезно для некоторых людей. Если да, оставьте, пожалуйста, комментарий!

4
ответ дан 13 December 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: