2017-09-15 2 views
0

몇 가지 다른 장소의 요소를 블렌드하는 폼을 만들려고합니다. 나는 이것을 할 수있는 최선의 방법이 다른 두 가지 형태 일 수 있으며, 다른 누군가가 그 모든 것을 하나의 형태로 다룰 수 있도록 도울 수 없다면, 같은 페이지에 그들을 보여줄 것이라고 생각한다.두 개의 다른 모델의 특성을 사용하는 폼 만들기

두 가지 양식을 사용하는 데 아무런 문제가 없지만 진행 방법이 확실하지 않습니다. 어쩌면 진행할 필요가 없습니다.

필자는 Person (User) 및 Friend와 PersonBenefits를 공유하는 두 가지 클래스가 있습니다.

모델은 다음과 같이 보일 것이다 : 기본적으로

class GoodBenefitForm(forms.Form): 
    benefit = forms.ModelChoiceField(
     queryset=Benefit.objects.filter(type__name='Good'), 
     widget = forms.Select(attrs={'class':'g-1-3'}) 
    ) 
# THIS SHOWS A LIST OF ALL THE FRIENDS FOR THIS USER - DISPLAYS THEIR NAMES NICELY WITH CHECKBOXES 
    friend = forms.ModelMultipleChoiceField(
     queryset = Friend.objects.none(), 
     widget = forms.CheckboxSelectMultiple(), 
    ) 
# I WANT THIS TO BE A BUNCH OF TEXTBOXES INSTEAD OF CHECKBOXES - ONE FOR EACH FRIEND FOR THE USER 
    friend_group_id = forms.ModelMultipleChoiceField(
     queryset = Friend.objects.none(), 
     widget = forms.CheckboxSelectMultiple(), 
    ) 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user') 
     queryset = Friend.objects.filter(person=self.user) 
     super(FriendBenefitForm, self).__init__(*args, **kwargs) 
     self.fields['friend'].queryset = queryset 
     self.fields['friend_group_id'].queryset = queryset 

내가 '친구'의 목록을 표시하는 양식을 얻으려고 :

class PersonBenefit(models.Model): 
    benefit = models.ForeignKey(Benefit, null=True) 
    user = models.ForeignKey(User) 

class Friend(models.Model): 
    first_name = models.CharField(max_length=40) 
    last_name = models.CharField(max_length=40) 
    has_benefit = models.BooleanField(default=False) 
    ben_id_num = models.CharField(max_length=10, blank=True, null=True) 
    person = models.ForeignKey(User) 

#good, better, best 
class BenefitType(models.Model): 
    name = models.CharField(max_length=25) 

    def __str__(self): 
     return self.name 


class Benefit(models.Model): 
    type = models.ForeignKey(BenefitType) 
    name = models.CharField(max_length=25) 

forms.py이 같이 보입니다 확인란을 선택한 다음 이름 옆에 사용자가 입력 할 수있는 텍스트 필드를 표시합니다. ben_id_num

다시 읽은 후, 두 개의 개별 양식을 사용하면 갈 수있는 최선의 방법이 될지 모르겠지만 어쩌면 내가 단지 내 form.py에서 바보 같은 짓을하는지, 단지 하나의 양식으로 작동 할 수 있는지 잘 모르겠다. 각 '친구'를 들어

을 즉시 ben_id_num

답변

1

그것은 소리를 자신에 해당하는 (그 다음 친구의 이름과 텍스트 필드에 체크 박스가있는 작은 폼을 표시 :

이것은 본질적 것 당신이 찾고있는 것은 같은 형태로 하나 개 이상의 관련 모델 모델을 편집 할 수 Django Formset,처럼.

나는 formsets를 만들기 위해 django-extra-views에서 제공하는 CreateWithInlinesViewUpdateWithInlinesView를 사용하여 일부 성공을 거두었습니다 쓰레기 쉽게 관리 할 수 ​​있습니다.

양식에 많은 사용자 정의 논리가 필요한 경우 해당 필드를 모두 사용자 정의 양식에 추가 한 다음 FormViewform_valid(self, form) 방법으로 사용자 정의 논리를 작성하는 것을 막을 수있는 방법은 없습니다.

장고에 대한 좋은 점은 가능한 경우 도우미 클래스를 사용할 수 있다는 것입니다. 그러나 더 맞춤형 솔루션이 필요한 경우 수동으로 처리 할 수 ​​있습니다.

+0

지금 formset의 문서를 읽고 있습니다. 의사가 주문한 것일 수도 있습니다. 내가 지금 생각해 낼 수있는 것을보기 위해 지금 시도하고있다! 그것이 효과가 있다면, 이것은 대접이 될 것입니다! – Hanny

+0

@Hanny Formsets는 약간의 연습을하지만, 익숙해지면 정말 편리합니다. 행운을 빕니다! – Franey

+0

잘 돌아갔습니다. 사실 modelformset_factory가 내가 찾고 있던 모델이라는 사실을 알았습니다! – Hanny