如何为AJAX请求创建单独的视图函数?

时间:2017-01-24 02:24:57

标签: jquery python ajax django django-views

我的观点功能变得相当混乱,所以可以从我的视图文件中的单独函数调用我的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(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')

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。

只需在urls.py中为AJAX函数提供自己的URL,并在POST数据时指向该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数据可能很容易注入。

编辑: 我相信OP和我有不同的发布数据的策略。我通过按钮处理程序上的jquery调用处理我的所有AJAX帖子。所以,在你的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
     }
});

这将允许您直接从网页将数据直接发布到django函数的URL。如果您在发送数据时遇到问题,可能需要启用CSRF Protection,但这就像将一些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数据中没有非法字符或注入脚本。