Django Form:根据用户在表单中创建的对象过滤和显示选项

问题描述 投票:0回答:1

当前的问题是我的表单向登录用户显示了曾经创建的所有“套牌”。该表单应仅显示登录用户创建的“牌组”。我可以过滤给定用户的牌组,但我无法将该信息作为用户可以选择的唯一选项传递。

模型.py

class Profile(models.Model):
    profile_pic = models.ImageField(null=True, blank=True, default='Default.png', upload_to='images/')

    user = models.ForeignKey(User, max_length=10, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return str(self.user)
    
class Deck(models.Model):
    deck = models.CharField(max_length=150)
    is_cedh = models.BooleanField(default=False)

    user = models.ForeignKey(User, max_length=10, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.deck

class Game(models.Model):
    deck = models.ForeignKey(Deck, on_delete=models.CASCADE, null=True)
    wincon = models.ForeignKey(Wincon, on_delete=models.CASCADE, null=True, blank=True)
    tournament = models.BooleanField(default=False)

    num_players = models.IntegerField(choices=NUM_PLAYERS_CHOICE, default=4)
    start_pos = models.CharField(max_length=20, choices=START_POS_CHOICE, default=1)
    mull = models.CharField(max_length=20, choices=MULL_CHOICE, default='1st 7')
    outcome = models.CharField(max_length=10, choices=OUTCOME_CHOICE, default='Win')
    medium = models.CharField(max_length=10, choices=MEDIUM_CHOICE, default='Paper')
    date = models.DateField(auto_now=True)
    time = models.TimeField(auto_now=True)

views.py

def game_tracker(request):
    user_decks = Deck.objects.filter(user=request.user)
    if request.method == "POST":
        form = GameForm(request.POST)
        if form.is_valid():
            return HttpResponseRedirect('/track')
    else:
        form = GameForm()

    context = {'form': form, }
    return render(request, 'gametracker_app/gametracker.html', context=context)

表格.py

class GameForm(forms.ModelForm):
    class Meta:
        model = Game
        exclude = {'date', 'time', }
        labels = {
            'deck': 'What deck',
            'num_players': '# of Players',
            'start_pos': 'Starting position',
            'mull': 'Starting hand',
            'outcome': 'Outcome',
            'wincon': 'Wincon',
            'medium': 'Paper or Online',
            'tournament': 'Tournament',
        }
python django django-models django-forms
1个回答
0
投票

您需要修改您的表单和views.py。

在您的表格中..

class GameForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        super(GameForm, self).__init__(*args, **kwargs)
        self.fields['deck'].queryset = Deck.objects.filter(user=user)
    
    class Meta:
        # ...

在你看来..

@login_required
def game_tracker(request):
    user_decks = Deck.objects.filter(user=request.user)

    if request.method == "POST":
        form = GameForm(request.user, request.POST)
        if form.is_valid():
            return HttpResponseRedirect('/track')
    else:
        form = GameForm(request.user)
    # ....
© www.soinside.com 2019 - 2024. All rights reserved.