【问题标题】:Django - How to pass data to new view (not in url)Django - 如何将数据传递给新视图(不在 url 中)
【发布时间】:2021-11-18 07:00:48
【问题描述】:

如何将几个变量传递/重定向到新视图,但我想在场景下而不是在 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)

模板

<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 当用户单击“下一步”按钮时,他将被重定向到查看 AddParing3View,但有一些数据,他已经在表单 (p1, p2, p3) 中提交并用这些数据填写新表单。

我已经尝试过会话,但即使我点击“新”,它也会“传递”数据。

有没有简单的方法来传递这 3 个变量?

【问题讨论】:

    标签: python django session


    【解决方案1】:

    一种方法是将“新”链接放置在带有隐藏字段的表单中,并将操作设置为POST。这样,数据就会无形地传输到下一个视图。但是,这会使您的数据容易受到修改。

    更好的方法是将数据存储在 cookie 中(也可以编辑)或尝试使会话正常工作。您可以在新问题中使用会话功能来表述您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 2019-03-23
      • 1970-01-01
      相关资源
      最近更新 更多