Django: Как перейти к URL с опцией выбора, используя GET и views.py вместо чистого подхода JavaScript
Я показываю два решения, одно с GET, другое с Javascript. В обоих случаях мне нужно дважды нажать кнопку "Назад", чтобы вернуться на предыдущую страницу. Я думаю, что это проблема Django.
GET case
В templates
у меня есть следующая форма:
<form id="form-user" action="" method="GET">
<select id="user" data-slug="{{x.user}}" onChange=selectChange(this)>
<option value="view">View</option>
</select>
</form>
<script>
function selectChange(select) {
var selectID = select.id;
var value = select.value;
if ($('#'+selectID).data('slug')) {
var my_slug = $('#'+selectID).data('slug');
var my_url_creator = "{% url 'profiles:profile-detail' slug=none %}".replace(/none/, my_slug.toString());
}
if (value == 'view'){
$("#form-"+selectID).attr("action", my_url_creator);
$("#form-"+selectID).submit();
}
}
В views.py
у меня есть:
class ProfileView(DetailView):
model = Profile
def get_object(self, *args, **kwargs):
myslug = self.kwargs.get('slug')
user = User.objects.get(username=myslug)
profile = Profile.objects.get(user=user)
return profile
При таком подходе я попадаю на страницу профиля {{x.user}}=user1
, однако, когда я нажимаю кнопку назад в браузере, он переходит от mypath/user1
к mypath/user1?
. Мне не нравится этот ?
. Чтобы вернуться на предыдущую страницу, мне нужно дважды нажать кнопку "Назад". Я хотел бы нажать ее только один раз и убрать этот ?
шаг перехода.
Javascript case
views.py
не изменяется, так как в нем нет необходимости. template
очень похоже, мы просто удаляем method="GET"
в теге HTML-формы, а в javascript меняем только следующее:
if (value == 'view'){
window.location.href = my_url_creator;
}
Здесь также, мне удается перейти на страницу пользователя, однако, чтобы вернуться на предыдущую страницу, мне нужен двойной щелчок, в этом случае он переходит от mypath/user1
к mypath/user1
и затем к предыдущему случаю.
Я считаю, что это проблема django, но не уверен, что мы можем ее решить
РЕДАКТИРОВАНИЕ:
По предложению views.py
лучше написать так:
def get_object(self, *args, **kwargs):
slug = self.kwargs.get('slug')
return get_object_or_404(Profile, user__username=slug)
Однако это не устраняет проблему.
А как насчет просто ссылки?
<a href="{% profiles:profile-detail slug=x.user %}">View</a>
С помощью CSS можно оформить ссылку как кнопку или что-то другое. Это вызовет GET-запрос. POST-запрос не имеет особого смысла, поскольку вы не изменяете состояние: GET-запросы не должны иметь побочных эффектов, а POST-запросы обычно используются для создания, обновления или удаления данных.
Вашу точку зрения также можно упростить: извлечение User
является не необходимым:
from django.shortcuts import get_object_or_404
class ProfileView(DetailView):
model = Profile
def get_object(self, *args, **kwargs):
return get_object_or_404(Profile, user__username=myslug)