Django - Как передать данные новому представлению (не в url)
Как я могу передать/перенаправить несколько переменных в новое представление, но я хочу сделать это под сценой, а не в URL.
models.py
class Parings_3(models.Model):
name = models.CharField(max_length=64)
p1 = models.CharField(max_length=16, choices=ARMIES_CHOICE)
p2 = models.CharField(max_length=16, choices=ARMIES_CHOICE)
p3 = models.CharField(max_length=16, choices=ARMIES_CHOICE)
op1 = models.CharField(max_length=16, choices=ARMIES_CHOICE)
op2 = models.CharField(max_length=16, choices=ARMIES_CHOICE)
op3 = models.CharField(max_length=16, choices=ARMIES_CHOICE)
p11 = models.IntegerField()
p12 = models.IntegerField()
p13 = models.IntegerField()
p21 = models.IntegerField()
p22 = models.IntegerField()
p23 = models.IntegerField()
p31 = models.IntegerField()
p32 = models.IntegerField()
p33 = models.IntegerField()
date = models.DateField(auto_now_add=True)
forms.py
class ParingsForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(ParingsForm, self).__init__(*args, **kwargs)
for i in ["p11", "p12", "p13", "p21", "p22", "p23", "p31", "p32", "p33"]:
self.fields[i].widget.attrs["min"] = -2
self.fields[i].widget.attrs["max"] = 2
class Meta():
model = Parings_3
fields = ["name", "p1", "p2", "p3", "op1", "op2", "op3", "p11", "p12", "p13", "p21", "p22", "p23", "p31", "p32", "p33"]
views.py
class AddParing3View(View):
def get(self, request):
form = ParingsForm()
ctx = {"form": form}
return render(request, "add_paring_3_form.html", ctx)
def post(self, request):
form = ParingsForm(request.POST)
if form.is_valid():
form.save()
return redirect("parings-view")
class ParingDetails3View(View):
def get(self, request, id):
player = Parings_3.objects.get(pk=id)
teamA = [player.p1, player.p2, player.p3]
teamB = [player.op1, player.op2, player.op3]
ctx = {
"teamA": teamA,
"teamB": teamB,
"player": player
}
return render(request, "paring_details_3.html", ctx)
views.py с сессиями
class AddParing3View(View):
def get(self, request):
if request.session["teamA3"]:
teamA = request.session['teamA3']
form = ParingsForm(initial={
"p1": teamA[0],
"p2": teamA[1],
"p3": teamA[2],
})
ctx = {"form": form}
return render(request, "add_paring_3_form.html", ctx)
else:
form = ParingsForm()
ctx = {"form": form}
return render(request, "add_paring_3_form.html", ctx)
def post(self, request):
form = ParingsForm(request.POST)
if form.is_valid():
form.save()
return redirect("parings-view")
class ParingDetails3View(View):
def get(self, request, id):
player = Parings_3.objects.get(pk=id)
teamA = [player.p1, player.p2, player.p3]
teamB = [player.op1, player.op2, player.op3]
request.session['teamA3'] = teamA
ctx = {
"teamA": teamA,
"teamB": teamB,
"player": player
}
return render(request, "paring_details_3.html", ctx)
templates
<button type="button" class="btn btn-color rounded-1 pt-1 pb-1">
<a class="nav-link btn-color" href="{% url 'add-paring-3' %}">Next</a>
</button>
<button type="button" class="btn btn-color rounded-1 pt-1 pb-1">
<a class="nav-link btn-color" href="{% url 'add-paring-3' %}">New</a>
</button>
urls.py
path("paring_3/<int:id>/", ParingDetails3View.as_view(), name="paring-details-3"),
path("add_paring_3/", AddParing3View.as_view(), name="add-paring-3"),
Что я хочу сделать. Пользователь создал Paring и находится в ParingsDetailsView. Когда пользователь нажимает на кнопку "Новый", он будет перенаправлен на просмотр AddParing3View Когда пользователь нажимает на кнопку "Next", он будет перенаправлен на просмотр AddParing3View, но с некоторыми данными, которые он уже отправил в форму (p1, p2, p3) и заполнить новую форму этими данными.
Я уже пробовал сеансы, но данные "проходят", даже если я нажимаю "new".
Есть ли простой способ передать эти 3 переменные?
Одним из способов может быть размещение ссылки "new" в форме со скрытыми полями и установка действия на POST
. Таким образом, данные передаются в следующий просмотр незаметно. Однако это делает ваши данные уязвимыми для модификации.
Лучшим способом было бы хранить данные в cookie (которые также можно редактировать) или попытаться заставить работать сессию. Вы можете сформулировать свои проблемы с функциональностью сессии в новом вопросе.