2012-01-23 1 views
3

Во время обработки формы я хотел бы иметь возможность установить поле внешнего ключа для объекта модели без необходимости выбора ключа из выпадающего списка.Как установить внешний ключ во время заполнения формы (python/django)

Например:

#models.py 
class AAA(models.Model): 

    some_field = models.TextField() 

class BBB(models.Model): 
    another_field = models.TextField() 
    key_field = models.ForeignKey('AAA') 

Пользователь будет перемещаться из точки зрения, показывая экземпляр «ААА» в целях create_object стиле, который создаст экземпляр «BBB» с учетом параметра со ссылкой на «AAA» , Внешний ключ установлен в код, чтобы вернуться к экземпляру «AAA».

Структура комментариев django, похоже, делает это, но я не могу понять, как.

Любые идеи? Я уверен, что это должно быть довольно просто.

ответ

20

Вы можете исключить key_field из своей типовой формы, сохранить с помощью commit=False, а затем установить key_field на ваш взгляд перед сохранением в базе данных.

class BBBForm(forms.ModelForm): 
    class Meta: 
     model = BBB 
     exclude = ("key_field",) 

def create_view(request, **kwargs): 
    if request.method == "POST": 
     aaa = # get aaa from url, session or somewhere else 
     form = BBBForm(request.POST) 
     if form.is_valid(): 
      bbb = form.save(commit=False) 
      bbb.key_field = aaa 
      bbb.save() 
      return HttpResponseRedirect("/success-url/") 
     ... 
+0

Ah ha! Ключевой особенностью, которую я отсутствовал, было утверждение «исключить». Раньше моя форма никогда не достигла стадии проверки, потому что поле «key_field» было обязательным. Большое спасибо! – powlo

+1

@paulus_almighty, если этот пост решил вашу проблему, вы можете выбрать его в качестве принятого (зеленая проверка слева), то же самое для всех ваших других вопросов – juliomalegria

2

Когда пользователь создает BBB через экземпляр AAA, это должно быть отражено в URL, то есть ваш «вид в стиле create_object» получит параметр идентификации AAA объекта. Вы можете использовать его, чтобы получить объект из базы данных и создать свой BBB объект соответственно:

from django.shortcuts import get_object_or_404 

def create_bbb_view(request, aaa_id): 
    a = get_object_or_404(AAA, id=aaa_id) 
    form = MyBBBCreationForm(request.POST) # or similar code 
    if form.is_valid(): 
     b = BBB.objects.create(key_field=a) # plus other data from form 
    # ... 

(Вы также можете установить key_field к aaa_id непосредственно, но это, вероятно, хорошая идея, чтобы проверить, если объект существует.)