我的观点功能变得相当混乱,所以可以从我的视图文件中的单独函数调用我的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')
答案 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数据中没有非法字符或注入脚本。