Вопрос относительно формы, вида и динамического набора запросов c - PullRequest
0 голосов
/ 15 апреля 2020

Эй, ребята, у меня есть вопрос относительно формы и набора запросов:

  1. Я создаю форму, в которой я выбираю фракцию из списка фракций.
  2. После создания формы, Я перенаправляю в другую форму, где я могу добавить солдат в этот список, но я вижу всех солдат каждой фракции в этой форме, я хотел бы видеть ТОЛЬКО солдат той фракции, которую я выбрал в предыдущей форме.

Можете ли вы помочь, пожалуйста, по этому вопросу, пожалуйста? Я немного растерялся, что искать ...

Мои модели:

class Faction(models.Model):
     title = models.CharField(max_length=30)
     picture = models.FileField(blank=True,)
     race = models.ForeignKey(Race, on_delete=models.CASCADE,default=None, blank=True, null=True)
     def __str__(self):
            return self.title
     def get_absolute_url(self):
            return reverse("home")



class List(models.Model):
    faction = models.ForeignKey(Faction, on_delete=models.CASCADE)
    title = models.CharField(max_length=30)
    format_points = models.IntegerField()
    description = models.CharField(max_length=30)
    author = models.ForeignKey(
        get_user_model(),
        on_delete=models.CASCADE,
    )
    def __str__(self):
        return self.title
    def get_absolute_url(self):
        return reverse("home")

class Soldier(models.Model):
    title = models.CharField(max_length=30)
    picture = models.FileField(blank=True,)
    points = models.IntegerField()
    factions = models.ManyToManyField(Faction)
    def __str__(self):
        return self.title

class SoldierToList(models.Model):
    soldier = models.ForeignKey(Soldier, on_delete=models.CASCADE,)
    list = models.ForeignKey(List, on_delete=models.CASCADE,)
    author = models.ForeignKey(
        get_user_model(),
        on_delete=models.CASCADE,
    )

Мои просмотры:

class ListCreateFormView(CreateView):
    template_name = 'armybuilder_list_create.html'
    model = List
    form_class = CreateListForm
    def form_valid(self, form):
        form.instance.author = self.request.user
        form.instance.race = "toto"
        return super().form_valid(form)
    def get_success_url(self):
        return reverse_lazy('add_unit_to_list', kwargs={'pk': self.object.pk})

class AddUnitsToListFormView(LoginRequiredMixin,FormView):
    model = SoldierToList
    form_class = SoldierToListForm
    template_name = 'armybuilder_add_unit_to_list.html'
    def get_queryset(self):
        return Soldier.objects.filter(factions=Tyranids) ## for some test, I need to change this line I think ? 
    def form_valid(self, form):
        form.instance.author = self.request.user
        form.instance.list_id = self.kwargs['pk']
        return super().form_valid(form)

Мои формы:

class CreateListForm(forms.ModelForm):
    class Meta:
        model = List
        fields = ('faction','title', 'format_points', 'description')

class SoldierToListForm(forms.ModelForm):
    class Meta:
        model = SoldierToList
        fields = ('soldier',)

Мои URL:

path('list/create', ListCreateFormView.as_view(), name='create_list'),
path('list/own/<int:pk>/addunit', AddUnitsToListFormView.as_view(), name='add_unit_to_list'),

Спасибо за помощь и хорошего дня!

1 Ответ

0 голосов
/ 15 апреля 2020

передать первичный ключ выбранной фракции в форму и инициализировать форму. def __init__(self, *args, **kwargs) super().__init__(*args, **kwargs) factions_obj = Faction.objects.get(pk=faction_pk) self.fields['soldier'].queryset = factions_obj.soldier_set.all()

...