2013-12-10 3 views
0

Интересно, как я мог исключить редактируемый объект из набора запросов, и он по-прежнему работает, если я использую ту же форму для создания объекта.django form create or edit exclude object

Моей форма:

class CountryForm(forms.ModelForm): 
    """Form to create or edit Countries.""" 

    name = forms.CharField() 
    flavor = forms.CharField(
    widget=forms.Textarea(attrs={'width': 300, 'height': 100})) 
    history = forms.CharField(
     widget=forms.Textarea(attrs={'width': 300, 'height': 100})) 
    likes_set = Country.objects.all().exclude(self) 
    likes = forms.ModelChoiceField(queryset=likes_set, empty_label="Country it likes" 

    class Meta: 
     model = Country 

ответ

1

Вы должны сделать это в __init__() методе, а также передать instance переменными, если имеются в то время как инстанцирование формы.

class CountryForm(forms.ModelForm): 
    """Form to create or edit Countries.""" 

    name = forms.CharField() 
    flavor = forms.CharField(
    widget=forms.Textarea(attrs={'width': 300, 'height': 100})) 
    history = forms.CharField(
     widget=forms.Textarea(attrs={'width': 300, 'height': 100})) 
    likes = forms.ModelChoiceField(queryset=Country.objects.all(), empty_label="Country it likes" 

    class Meta: 
     model = Country 

    def __init__(self, *args, **kwargs): 
     super(CountryForm, self).__init__(*args, **kwargs) 
     if 'instance' in kwargs: 
      self.fields['likes'].queryset = Country.objects.exclude(kwargs['instance']) 

В связи вы должны создать форму, как

myform = CountryForm(instance=country_obj) 

или

myform = CountryForm(request.POST, instance=country_obj) 
+0

Спасибо я пойти попробовать это и погружение глубже в __init__ никогда не получил, что :( –

+0

I думаю, я понял, что это единственное, что я еще не понял, как это работает над созданием новой Страны, должен ли я просто создать пустой объект и передать это? –

+0

@HansdeJong, когда вы повторно создавая новый объект, не передавайте переменную 'instance'. В этом случае 'любит' перечислит все объекты. – Rohan