Как использовать возвратный редирект в качестве функции обратного вызова в Django
Я пытаюсь заставить свой код работать в течение всего дня. У меня есть функция представления, но она слишком многословна, плюс я пытаюсь использовать ее реализацию в другом представлении, поэтому я пытаюсь рефакторить код для функции, чтобы она могла работать в другом представлении. Мне удалось заставить функцию работать, за исключением того факта, что внутри функции есть return redirect
с именем профиля (это обычная функция, а не функция представления). Каждый раз, когда я пытаюсь запустить код, передавая редирект в качестве функции обратного вызова, он всегда выдает HttpRedirectError и также отображает местоположение объекта в памяти, как я могу использовать возвращаемый редирект в качестве обратного вызова или любым другим способом заставить его работать с моим кодом. Код функции:
def foo(filter,images,request,redirector):
#do something
return redirect(redirector)
Код представления:
if something:
foo(filter,images,request,'home')
Для просмотра также были опробованы:
def redirector():
return 'home'
foo(property,images,request,redirector)
Есть ли способ заставить это работать, если не получится, придется повторять ненужные коды для другой функции.
Прежде чем предложить решение, я должен сказать, что, похоже, вам не хватает понимания основ python и вы изобретаете какие-то странные подходы к построению представлений Django. Вам необходимо изучить, как работают функции, что означает оператор return
и так далее.
Для начала Django view - это просто функция, которая принимает объект запроса и возвращает объект ответа.
Наличие вспомогательной функции, выполняемой внутри нее, совершенно нормально, вы можете поместить ее в helpers.py
или в любой другой файл, который имеет смысл для вас.
Но почему вы заставляете ее возвращать перенаправление? Похоже, вы просто усложняете свою собственную задачу.
Давайте рассмотрим очень простой пример. Допустим, вы хотите, чтобы представление находило любимую фотографию пользователя из собственной галереи, используя помощник:
# picture model
class Picture(models.Model):
# correct way to refer user model for your project
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
rating = models.PositiveSmallIntegerField(default=5)
# image file field
img = models.ImageField()
# helper function - find a picture with highest rating from a queryset
def get_favourite_picture(picture_qs):
# order queryset by rating descending
picture_qs = picture_qs.oreder_by('-rating')
# select first item
picture = picture_qs.first()
# return from function only the picture object as result
return picture
# view
def redirect_to_favourite(request):
# it's how you get pictures where owner is current user
picture_qs = request.user.picture_set.all()
# let function handle just getting a pic
picture = get_favourite_picture(picture_qs)
# and let the view handle the redirect (return redirect response)
# to the view that shows a single image by it's PK (Primary Key - an id)
return redirect("picture_detail", kwargs={'pk': picture.pk})