Как установить ForeignKey на основе учетной записи пользователя, когда я сохраняю новый элемент с дополнительным полем modelformset_factory? - PullRequest
0 голосов
/ 27 декабря 2018

У меня две проблемы:

1) Я хотел бы добавить нового игрока в дополнительное поле Formset, но когда я его сохраняю, у меня возникает IntegrityError, потому что

 team = models.ForeignKey(Team, on_delete=models.CASCADE

не установлен.Мне нужно, чтобы значение команды было

team=request.user.team

, но я не знаю, где поместить это в мои views.py или нужно ли мне переопределить некоторые существующие функции.

2)Когда я отрисовываю сайт в конце каждой формы, появляется строка "Human ptr:" ... как я могу удалить его?


У меня есть форма, созданная с помощью formset_factory, которая выглядит так:


team_area.html

{% extends 'base_layout.html' %}

{% block content %}
  <h1>Area Squadra</h1>
  <form method="post" action="">
    {% csrf_token %}
    {{ player_formset.management_form }}
    {% for player_form in player_formset %}
        {% for field in player_form %}
            {{ field.label_tag }} {{ field }}
        {% endfor %}
        <br>
    {% endfor %}
    <input type="submit" value="Aggiorna">
  </form>
{% endblock %}

И представление управляется:


views.py

from django.shortcuts import render, redirect
from skeleton.models import Player
from django.contrib.auth.decorators import login_required
from .forms import PlayerForm
from django.forms import modelformset_factory


# Create your views here.
@login_required(login_url="/accounts/login/")
def team_area(request):
    PlayerFormSet = modelformset_factory(Player, fields=('first_name', 'last_name'), extra=1)
    if request.method == "POST":
        player_formset = PlayerFormSet(
            request.POST,
            request.FILES,
            queryset=Player.objects.all().filter(team=request.user.team),)

        if player_formset.is_valid():
            player_formset.save()
            return redirect('team_area:home')
    else:
        player_formset = PlayerFormSet(queryset=Player.objects.all().filter(team=request.user.team))
    return render(request, 'team_area/team_area.html', {'player_formset': player_formset})

Модель проигрывателя:


class Human(models.Model):
    SHIRT_SIZES = (('XXS', 'XXS'), ('XS', 'XS'), ('S', 'S'), ('M', 'M'), ('L', 'L'), ('XL', 'XL'), ('XXL', 'XXL'))
    team = models.ForeignKey(Team, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=16)
    last_name = models.CharField(max_length=16)
    jersey_size = models.CharField(max_length=4, choices=SHIRT_SIZES, blank=True)
    slug = models.SlugField(blank=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.first_name + ' ' + self.last_name)
        super(Human, self).save(*args, **kwargs)

    def __str__(self):
        return self.first_name + ' ' + self.last_name


class Player(Human):
    year_of_birth = models.IntegerField(validators=[MinValueValidator(1900), MaxValueValidator(2100)], blank=True, null=True)
    jersey_number = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(99)], blank=True, null=True)
    all_star_game = models.ForeignKey(AllStarGame, on_delete=models.CASCADE, blank=True, null=True)

...