Django - форма обработки, которая содержит флажки с отношением ManyToMany - PullRequest
0 голосов
/ 19 января 2019

Я пытался заставить это работать, но я, кажется, делаю что-то не так.

Чего я хочу достичь:

У меня есть модель Venue с множеством удобств:

class Venue(TimeStampedModel):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=250)
    type = models.ForeignKey(VenueType, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class Amenity(TimeStampedModel):
    category = models.ForeignKey(AmenitiesCategory, on_delete=models.CASCADE)
    venues = models.ManyToManyField(Venue, blank=True)
    name = models.CharField(max_length=250)
    description = models.TextField()

    def __str__(self):
        return self.name

Когда пользователь создает место встречи, я хочу, чтобы он мог просматривать все созданные удобства и выбирать те, которые подходят для его места.

В моем шаблоне я сейчас отображаю все параметры удобства следующим образом:

То, что я использовал первым (я предпочитаю это, так как сначала я могу просмотреть все категории удобств):

<div class="ui container">
    <h2>Select all that are applicable</h2>

    <form method="POST" class="ui form">
        {% csrf_token %}
        {% for category in categories %}
        <h4 class="ui horizontal divider header">
            <i class="list icon"></i>
            {{category.category}}
        </h4>
        <p class="ui center aligned text"><u>{{category.description}}</u></p>

        {% for amenity in category.amenity_set.all %}

        <div class="inline field">
            <div class="ui checkbox">
                <input type="checkbox" value="{{amenity.id}}" name="choices">
                <label><span data-tooltip="{{amenity.description}}" data-position="top left">{{amenity}}</span></label>
            </div>

        </div>
        {% endfor %}
        {% endfor %}
        <button type="submit" name="submit" class="ui button primary">Next</button>

    </form>

Что я использовал после:

    <form method="POST" class="ui form" action=".">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" name="next" class="ui button primary">Next</button>
    </form>
</div>

Для второго случая я использовал эту ModelForm:

class AmenitiesForm(ModelForm):
    class Meta:
        model = Amenity
        fields = ['choices']

    choices = forms.ModelMultipleChoiceField(Amenity.objects.all(), widget=forms.CheckboxSelectMultiple,)

До этого я использовал обычные формы. Форму, но по какой-то причине мне не удалось обработать ее.

Вот вид, который я использую сейчас:

class AddAmenitiesView(LoginRequiredMixin, CreateView):

    model = Venue
    form_class = AmenitiesForm
    template_name = 'venues/add_amenities.html'

    def parent_venue(self):
        parent_venue = Venue.objects.get(id=self.kwargs["venue_id"])
        return parent_venue

    def form_valid(self, form):
        # I AM VERY CONFUSED ON WHAT TO DO HERE
        return super().form_valid(form)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["parent_venue"] = self.parent_venue()
        return context

    def get_success_url(self):

        if 'add-another-space' in self.request.POST:
            return reverse('add-venue-images', kwargs={'venue_id': self.object.venue.id, })
        else:
            return reverse('home')

В моем form_valid () я не знаю, как обрабатывать форму. Когда флажок установлен, он должен добавить связь между этим удобством и местом проведения.

Надеюсь, я вас не смутил так сильно, как смутил себя.

Большое спасибо, что нашли время!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...