Могу ли я подключить класс "Player" из моделей к полю в UserCreationForm из библиотеки Django - PullRequest
0 голосов
/ 08 мая 2019

Я создаю приложение, которое позволяет вам вводить ваше имя, адрес электронной почты, пароль в форме, и оно создает игрока с базовым целочисленным счетом ELO, полем даты и именем, а затем добавляю форму, которая создает игру с 2 Поля игрока, 2 целочисленных поля для забитых голов и поле даты. Приложение будет иметь 3 основных функции формы: 1) поиск истории игр игрока и оценка 2) добавить игру (я хочу добавить игры так, чтобы они были связаны с входящими игроками), и, наконец, зарегистрироваться (создать пользователя с имя, пароль и адрес электронной почты, а также имя для создания экземпляра Player, который будет привязан к пользователю. В настоящее время я могу получить доступ к своей странице администратора и вручную выбрать пользователя для игроков, которых я создал в терминале, но я не совсем понимаю, как Я должен создать свою регистрационную форму таким образом, чтобы Игрок создавался автоматически при регистрации пользователя. Надеюсь, когда я увижу, как работает привязка Игроков к Пользователям, я смогу выяснить, как привязать Игры к Игрокам

Я попытался добавить form.ModelField (Player) и скрыл поле, но я не уверен, как присвоить имя Player.

Мои формы.py:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import Player


class PlayerForm(UserCreationForm):
    email = forms.EmailField(required=True)
    player = forms.ModelForm(Player, widget=forms.HiddenInput)

    class Meta:
        model = User
        fields = (
            'first_name',
            'last_name',
            'email',
            'password1',
            'password2',
            'player',
        )

    def save(self, commit=True):
        user = super(PlayerForm, self).save(commit=False)
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.email = self.cleaned_data['email']
        user.password1 = self.cleaned_data['password1']
        user.password2 = self.cleaned_data['password2']

        if commit:
            user.save()

        return user

my models.py

class Player(models.Model):
    name = models.CharField(max_length=100)
    elo = models.IntegerField()
    date_added = models.DateTimeField(default=timezone.now)
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.name) + " = " + str(self.elo)


class Game(models.Model):
    date_played = models.DateTimeField(default=timezone.now)
    player1 = models.ForeignKey(Player,on_delete=models.CASCADE, related_name="+")
    p1goal = models.IntegerField()
    player2 = models.ForeignKey(Player,on_delete=models.CASCADE, related_name="+")
    p2goal = models.IntegerField()

    def __str__(self):
        return str(self.date_played) + " - " + str(self.player1) + " " + str(self.p1goal) + " to " + \
               str(self.p2goal) + str(self.player2)

Я попытался добавить user.player = Player (имя, elo) с полем elo, равным 1000, и именем пользователя user.first_name + "" + user.last_name, и я попробовал self.first_name + "" + self.last_name, но ни один не работал.

1 Ответ

0 голосов
/ 08 мая 2019

Я думаю, вы можете попробовать что-то вроде этого:

def save(self, commit=True):
    user = super(PlayerForm, self).save(commit=False)
    user.first_name = self.cleaned_data['first_name']
    user.last_name = self.cleaned_data['last_name']
    user.email = self.cleaned_data['email']
    user.password1 = self.cleaned_data['password1']
    user.password2 = self.cleaned_data['password2']

    new_player = Player(name=user.first_name,
                        elo=1000,
                        date_added=datetime.datetime.now(),
                        user=user)
    if commit:
        user.save()
        new_player.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...