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 (которые также можно редактировать) или попытаться заставить работать сессию. Вы можете сформулировать свои проблемы с функциональностью сессии в новом вопросе.

Вернуться на верх