2015-01-25 1 views
1

Это мой первый вопрос, и я пишу, потому что я схожу с ума, даже после чтения документации и множества ответов здесь. Большое вам спасибо и извините за мой плохой английский!Форма, создание и обновление вида для отношений «многие-ко-многим»

У меня есть эти модели:

class Profile(models.Model): 
    name = models.CharField(max_length = 255, blank = False) 
    user = models.ForeignKey(User, blank = True, null = True) 

class Category(models.Model): 
    name = models.CharField(max_length = 50, blank = False) 

class ProfileCategory(models.Model): 
    profile = models.ForeignKey(Profile) 
    category = models.ForeignKey(Category) 

    class Meta: 
     unique_together = ('profile', 'category') 

эта модель правильно? Я предполагаю, что у вас уже есть база данных с сохраненными категориями. Мне нужна страница, на которой пользователь может создать новый профиль и выбрать категории из списка флажков. Должен ли я использовать две формы на одной странице, одну для профиля и одну для выбора категорий или одной формы? Мне кажется, мне нужен ModelMultipleChoiceField для категорий. Мне также нужно представление, отображающее ту же форму, которая уже заполнена профилем и категориями, в которых пользователь может изменить имя профиля, и добавить или удалить категории.

Сообщите мне, если вам нужна дополнительная информация и большое спасибо.

+0

Добро пожаловать в переполнение стека! Вы получите лучшую помощь здесь, если вы укажете, что происходит с фрагментом кода, который вы опубликовали, - попробовали ли вы создать модель? Что случилось? Что было нарушено/не ведет себя так, как вы ожидали? –

+0

Да, я создал модель. 1) Я не знаю, правильна ли модель. 2) Я не знаю, как создать правильную форму для модели ProfileCategory 3) Я полагаю, что поле категории в моей модели ProfileCategory является полем ModelMultipleChoiceField, но я не знаю, как использовать это поле в случае вставки или обновить. – nobody

ответ

5

ProfileCategory модель здесь не нужно. Используйте ManyToMany поле для достижения того же результата:

class Category(models.Model): 
    name = models.CharField(max_length=50, blank=False) 

class Profile(models.Model): 
    name = models.CharField(max_length=255, blank=False) 
    user = models.ForeignKey(User, blank=True, null=True) 
    categories = models.ManyToManyField(Category, blank=True) 

Теперь вы можете редактировать профиль с одной формы, как и любой другой модели. Единственное, что вы должны запомнить, это позвонить save_m2m() в случае, если вы переопределите метод формы save().

приложение/forms.py

from django import forms 
from app.models import Profile 

class ProfileForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     widgets = { 
      'categories': forms.CheckboxSelectMultiple, 
     } 

приложение/views.py

из django.views.generic.edit импорта CreateView

from app.forms import ProfileForm 
from app.models import Profile 

class ProfileCreate(CreateView): 
    form_class = ProfileForm 
    model = Profile 

шаблоны/приложения /profile_form.html

<form action="" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Create" /> 
</form> 

приложение/urls.py

from app.views import ProfileCreate 

urlpatterns = patterns('', 
    ... 
    url(r'^profile/create/', ProfileCreate.as_view()), 
) 

Чтобы обновить профили использовать UpdateView с той же ProfileForm класса и шаблон.

EDIT: Если вам нужны дополнительные поля в ProfileCategory модели, то вы можете установить его в качестве посредника модели с through аргументом ManyToManyField. Чтобы редактировать такие модели, вы должны использовать формы. Узнайте больше об этом here, here и here.

+0

Танк вам очень понравился! Это работает как шарм, и я думаю, что это решение лучше, чем мое. Поэтому, если у меня нет поля в отношениях между мною и многими, мне не нужен третий модуль (ProfileCategory) в этом случае. Но если у меня есть эта 3-я модель, я могу использовать одно и то же решение, используя одну форму и save_m2m ()? Я в замешательстве об этом. Не могли бы вы мне сослаться на пример? Благодарю. – nobody

+0

С посреднической моделью вещи становятся намного сложнее. См. Обновленный ответ. – catavaran

+0

Большое спасибо! – nobody

Смежные вопросы