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() 메서드를 재정의하는 경우에 대비하여 save_m2m()으로 전화하는 것입니다. django.views.generic.edit 가져 오기 CreateView

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

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

템플릿/응용 프로그램에서

응용 프로그램/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

/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()), 
) 

프로파일이 같은 ProfileForm 클래스와 템플릿으로 UpdateView을 사용하여 업데이트하십시오.

편집 : 당신이 ProfileCategory 모델에서 추가 필드를해야 할 경우, 당신은 ManyToManyFieldthrough 인수와 함께 중간 모델로 설정할 수 있습니다. 이러한 모델을 편집하려면 형식 세트를 사용해야합니다. 그것에 대해 자세히 알아보십시오 here, herehere.

+0

대단히 감사합니다! 이것은 매력처럼 작동하며이 솔루션이 내 것보다 낫다고 생각합니다. 그래서 많은 관계에 많은 필드가없는 경우에는이 경우 3 번째 모듈 (ProfileCategory)이 필요하지 않습니다. 그러나이 3 번째 모델을 사용하면 동일한 솔루션을 하나의 양식과 save_m2m을 사용하여 사용할 수 있습니다 ()? 나는 이것에 관해 혼란 스럽다. 나에게 예를 들어 줄 수 있니? 감사. – nobody

+0

중간 모델을 사용하면 상황이 훨씬 더 복잡해집니다. 업데이트 된 답변을 참조하십시오. – catavaran

+0

대단히 감사합니다! – nobody

관련 문제