Как сделать отдельную функцию просмотра для запросов AJAX?

-1

Моя функция просмотров становится довольно беспорядочной, так что можно вызвать мои запросы ajax из отдельной функции в моем файле представлений?

Здесь мой взгляд

def article(request, category, id):

    name = resolve(request.path).kwargs['category']
    for a, b in CATEGORY_CHOICES:
        if b == name:
            name = a
            instance = get_object_or_404(Post, id=id, category=name)

    allauth_login = LoginForm(request.POST or None)
    allauth_signup = SignupForm(request.POST or None)

    #comments
    comment = CommentForm(request.POST or None)
    ajax_comment = request.POST.get('text')
    comment_length = len(str(ajax_comment))

    comment_list = Comment.objects.filter(destination=id)
    score = CommentScore.objects.filter(comment=comment_list)

    if request.is_ajax():
        username_clicked = request.GET.get('username_clicked')
        profile = Profile.objects.get(username=username_clicked)
        if username_clicked:
            print(profile.age)
        if comment.is_valid():
            comment = Comment.objects.create(comment_text=ajax_comment, author=str(request.user), destination=id)
            comment.save()

            score = CommentScore.objects.create(comment=comment)
            score.save()
            username = str(request.user)
            return JsonResponse({'text': ajax_comment, 'text_length': comment_length, 'username': username})
        else:
            print(comment.errors)


    context = {
        'score': score,
        'comment_list': comment_list,
        'comment': comment,
        'instance': instance,
        'allauth_login': allauth_login,
        'allauth_signup': allauth_signup
    }

    return render(request, 'article.html', context)

Например, для username_clicked, я хотел бы взять это и сделать его собственной функцией, подобной этой, в том же файле представлений:

def raise_profile(request):
    if request.is_ajax():
        username_clicked = request.GET.get('username_clicked')
        profile = Profile.objects.get(username=username_clicked)
        if username_clicked:
            print(profile.age)
            return HttpResponse()

Это возможно? Имейте в виду, что все они имеют одинаковый URL-адрес url(r'^(?P<category>\w+)/(?P<id>\d+)/', article, name='article')

Это возможно?

Обновленная функция:

def raise_profile(request):
    if request.is_ajax():
        username_clicked = request.GET.get('username_clicked')
        profile = Profile.objects.get(username=username_clicked)
        if username_clicked:
            print(profile.age)
            response_data = json.dumps({username_clicked})
            return HttpResponse(response_data, content_type='application/json')
Теги:
django-views

1 ответ

1
Лучший ответ

Да, это возможно.

Просто дайте функции AJAX собственный URL-адрес в urls.py и укажите этот URL-адрес при отправке своих данных.

urls.py:

url(r'^custom-ajax-function/', 'module.views.raise_profile'), 

Вы можете просто вернуть что-то вроде этого:

    response_data = json.dumps({})
    return HttpResponse(response_data, content_type='application/json')

При необходимости вставьте любые данные внутри дампа json.

Кроме того, я не уверен, что такое популярное мнение, но я бы удостоверился, что вы дезинфицируете свои данные запроса с помощью django. Я не уверен, что ваша версия Django делает это, но я всегда использовал формы для дезинфекции данных GET/POST. Я считаю, что получение необработанных данных GET может быть подвержено инъекциям.

edit: Я считаю, что OP и у меня разные стратегии публикации данных. Я обрабатываю все сообщения AJAX через вызовы jquery на обработчиках кнопок. Итак, в вашем HTML я бы сделал что-то вроде этого в jquery:

$('.button_handler').on('click', function(){ 
  //logic
  var posted_username = '...'
  .ajax({
      url: "/custom-ajax-function/",
      type: "POST",
      data: { 
           username: 'posted_username,
          },
      success:function(data) { 
         //Do something if it works, if you want
     }
});

Это позволит вам публиковать свои данные непосредственно с веб-страницы непосредственно на URL-адрес функции django. Если у вас проблемы с отправкой данных, вполне вероятно, что вам нужно включить защиту CSRF, но это так же просто, как вставка некоторых функций настройки javascript на вашу страницу.

Кроме того, это только я, и, возможно, ваша версия Django отличается, но я пишу мои обработчики следующим образом:

class data_form(forms.Form)
    username = form.CharField() 

def raise_profile(request):
    username_clicked = None 
    if request.method == 'POST':
        form = data_form(request.POST, request.FILES)
        if form.is_valid():
            username_clicked = form.cleaned_data.get('username')
    response_data = json.dumps(username_clicked)
    return HttpResponse(response_data, content_type='application/json')

is_valid() гарантирует, что в ваших данных POST нет незаконных символов или сценариев инъекций.

  • 0
    Итак, мой шаблон указывает на URL-адрес следующим образом: <h3><a href="{% url 'raise_profile' %}" class="username">{{ i.author }}</a></h3> url(r'^raise_profile/', views.raise_profile, name='raise_profile') , но я получаю сообщение об ошибке, говоря, что raise_profile didn't return an HttpResponse object. It returned None instead. У тебя есть идеи почему? Я опубликую функцию в моем редактировании.
  • 0
    Я думаю, что вы просто делаете вещи не так, как я, хотя я не решаюсь сказать, какая версия «правильная». Но моя версия должна решить эту проблему для вас. Я надеюсь, что мои правки были полезны.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню