Достижение пользователя django из шаблона javascript
Я следую руководству Кори Шафера по django и столкнулся с некоторыми проблемами, о которых он не рассказывает. Я пытаюсь сделать профили, которые видны всем, но редактируются только самим пользователем. В моем views.py у меня есть булево значение "editable", и эта часть работает. Однако я не могу передать это булево в мой js файл... Код ниже.
const button = document.getElementById("button");
button.addEventListener("click", () => {
const form = document.getElementById("form");
var bool = {{ user.profile.editable }};
if(form.style.display == "none" && bool){
form.style.display = "block";
}else{
form.style.display = "none";
}
});
Когда я проверяю его в браузере, он выдает syntaxError, потому что я использую '{'. А вот код из моего views.py:
@login_required
def profile(request, username):
user = User.objects.get(username=username)
Profile.objects.get_or_create(user=request.user)
editable = False
if request.method == "POST":
user_form = UserUpdateForm(request.POST, instance=request.user)
profile_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
messages.success(request, f"Profile successfully updated!")
return redirect("profile")
else:
user_form = UserUpdateForm(instance=request.user)
profile_form = ProfileUpdateForm(instance=request.user.profile)
context = {
"user_form": user_form,
"profile_form": profile_form
}
if request.user == user:
editable = True
return render(request, "users/profile.html", context)
Любая помощь будет очень признательна. Заранее спасибо!
Во-первых, если вы хотите получить доступ к редактируемой переменной, вам просто нужно передать ее в ваш контекст:
context['editable'] = editable
Во-вторых, считается плохой практикой передавать переменные Django непосредственно в тегах JS <script>
. Если вы хотите получить доступ к этим данным, то либо создайте скрытый ввод со значением, либо используйте тег json_script
:
https://docs.djangoproject.com/en/4.0/ref/templates/builtins/#json-script
В-третьих, похоже, что ваш код просто отображает и обрабатывает форму профиля. Я бы предложил поместить проверку редактируемости в начало представления и перенаправлять, если пользователь не обращается к своему профилю
получить значение как строку и проверить следующим образом: "{{ user.profile.editable }}"==="True"
const button = document.getElementById("button");
button.addEventListener("click", () => {
const form = document.getElementById("form");
var bool = "{{ user.profile.editable }}"==="True";
if(form.style.display == "none" && bool){
form.style.display = "block";
}else{
form.style.display = "none";
}
});