Я пытался заставить это работать, но я, кажется, делаю что-то не так.
Чего я хочу достичь:
У меня есть модель 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 () я не знаю, как обрабатывать форму. Когда флажок установлен, он должен добавить связь между этим удобством и местом проведения.
Надеюсь, я вас не смутил так сильно, как смутил себя.
Большое спасибо, что нашли время!