Django:基于之前的模型选择输入减少可能的选择数量

luaexgnf  于 2023-01-10  发布在  Go
关注(0)|答案(2)|浏览(113)

我有多个模型:

class Game(models.Model):
    name = models.CharField('Nom du jeu', max_length=100)
    logo = models.ImageField('Logo', blank=True, upload_to='game_logos')

class League(models.Model):
    game = models.ForeignKey(Game, verbose_name='Jeu', null=True, on_delete=models.SET_NULL)
    league = models.CharField('Ligue', max_length=20)
    hexcolor = models.CharField('Code couleur Hex', max_length=7, blank=True, default='#000000')

class Event(models.Model):
    game = models.ForeignKey(Game, verbose_name='Nom du jeu', null=True, on_delete=models.SET_NULL)
    event_type = models.CharField(verbose_name="Type d'événement", max_length=50, choices=type_course)
    league = models.ForeignKey(League, verbose_name='Ligue', null=True, on_delete=models.SET_NULL)
    circuit = models.ForeignKey(Circuit, verbose_name='Circuit', null=True, on_delete=models.SET_NULL)
    event_date = models.DateTimeField(verbose_name="Date de la course")

这里的逻辑是,我们有比赛,发生在某场比赛,在某个联赛。事情是,我可以有不同的游戏,有自己的联赛,独立于其他比赛的联赛(一级方程式将有联赛A,B和C,另一场比赛将有联赛1,2和3)。
所以当我设置一个新的事件时,只要我选择了游戏,我就想得到与这个游戏相关联的联赛,而不是所有的联赛。我如何根据游戏输入来过滤联赛的选择呢?

xam8gpfp

xam8gpfp1#

    • 备选案文1**

用户选择游戏,然后被重定向到一个新的页面,在那里他可以选择联赛和事件。

def select_league_and_event(request, game_pk):
    # game_pk = primary key of the selected game passed via url param
    game = Game.objects.get(pk=game_pk)
    leagues = game.league_set.all()  # you can filter them also
    events = game.event_set.all()

    context = {
        "leagues": leagues,
        "events": events,
    }
    return render(request, 'YOUR_HTML.html', context)
  • 您可以为外键指定related_name,而不是使用league_set,例如,您可以将其命名为game_leagues。因此,调用leagues = game.game_leagues.all()将得到相同的结果。*
    • 备选案文2**

如果用户在一个页面中选择了游戏、联赛和赛事,您必须a)将所有联赛和赛事传递给视图,并使用javascript根据所选游戏过滤联赛和赛事,或者b)您可以使用django rest框架在选择游戏后从REST API获取所有联赛和赛事。
选项a)非常简单,需要的代码较少,但如果你有很多联赛和赛事,它的性能可能会不足。那么选项b)是首选。

7tofc5zh

7tofc5zh2#

这取决于你是使用Django模板还是使用带有独立前端的Django Rest框架。我假设你使用的是Django模板。

简介

因此,Django应用运行在服务器端,这意味着你的python代码不会在浏览器中执行,也就是说,每当你想向用户显示新数据时,浏览器必须向服务器发送请求,服务器从数据库中获取数据并将其发送回用户的浏览器,这需要刷新页面。而且我们知道当你刷新页面时,任何状态(iidoEe.输入字段值)都会丢失。那么如何绕过这个问题呢?

URL参数

当你需要刷新页面同时保持状态时,最简单的方法就是把信息存储在你的URL中,除非信息被明显地保留,因为每个人都可以看到URL。
下面我将为您输入一个表单示例,其中包含两个select输入,第二个输入依赖于第一个输入。

<form method="get">
    <select name="game" id="id_game" onChange="this.form.submit()">
        <option>Select a game</option>
        {% for game in games %}
            <option value="{{ game.id }}" {% if game.id == selected_game_id %} selected {% endif %}>{{ game.name|title }}</option>
        {% endfor %}
    </select>
    <select name="league" id="id_league">
        <option>Select a league</option>
        {% for league in game_specific_leagues %}
            <option value="{{ league.id }}" {% if league.id == selected_league_id %} selected {% endif %}>{{ league.name|title }}</option>
        {% endfor %}
    </select>
</form>

为了使其工作,您必须在后端捕获URL参数,并通过上下文变量将它们传递到前端。

def get(self, request):
    game = request.GET.get('name', None)
    league = request.GET.get('league', None)

    context = {
        'games': Game.objects.all(),
        'game_specific_leagues': Game.league_set.all(),
        'selected_game_id': game,
        'selected_league_id': league
    }

    return render(request, 'your_template.html', context)

相关问题