2012-01-31 2 views
1

Я немного озадачен объектными моделями Django. У меня есть модели, как это:Пояснение к OneToOneField от Django, ManyToManyField и ManyToOneField

# Create your models here. 
class Item(models.Model): 
    code = models.CharField(max_length=200, unique=True) 
    barcode = models.CharField(max_length=300) 
    desc = models.CharField('Description',max_length=500) 
    reg_date = models.DateField('registered date') 
    registrar = models.CharField(max_length=100) 

    def __unicode__(self): 
     return self.code + ' : ' + self.desc 

class ItemInfo(models.Model): 
    item = models.OneToOneField(Item, primary_key=True) 
    supplier = models.ForeignKey(Supplier) 
    stock_on_hand = models.IntegerField() 
    stock_on_order = models.IntegerField() 
    cost = models.IntegerField() 
    price = models.IntegerField() 
    unit = models.CharField(max_length=100) 
    lead_time = models.IntegerField() 

Но когда я попытался восстановить позицию и ItemInfo в modelforms, я получил эту ошибку: 'ModelFormOptions' object has no attribute 'many_to_many'. Я подозревал, что что-то не так с этой строкой supplier = models.ForeignKey(Supplier). Может кто-то объяснила мне, когда использовать ForeignKey или отношения полого (OneToOneFields, ManyToManyFields, ManyToOneFields)

Edit: ModelForm:

class ItemForm(ModelForm): 
    class Meta: 
     model = Item 
     widgets = { 
      'registrar' : TextInput(attrs={'ReadOnly' : 'True'}) 
     } 

class ItemInfoForm(ModelForm): 
    class Meta: 
     model = ItemInfo 
     exclude = ('item') 

Это, как я генерировать форму с населенным значением из моделей:

def details(request, code): 
    csrf_context = RequestContext(request) 
    current_user = User 
    if request.user.is_authenticated(): 
     item = Item.objects.get(pk=code) 
     item_info = ItemInfo.objects.get(pk=item.pk) 
     item_form = ItemForm(instance=item) 
     item_info_form = ItemInfoForm(instance=item_form) 
     return render_to_response('item/details.html', 
            {'item_form' : item_form, 'item_info_form' :  item_info_form}, 
            csrf_context) 
    else: 
     return render_to_response('error/requires_login.html', csrf_context) 

Traceback: 
Traceback: 
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "G:\tulip\stock\item\views.py" in details 
    131.   item_info_form = ItemInfoForm(instance=item_form) 
File "C:\Python27\lib\site-packages\django\forms\models.py" in __init__ 
    237.    object_data = model_to_dict(instance, opts.fields, opts.exclude) 
File "C:\Python27\lib\site-packages\django\forms\models.py" in model_to_dict 
    112.  for f in opts.fields + opts.many_to_many: 

Exception Type: AttributeError at /item/details/1/ 
Exception Value: 'ModelFormOptions' object has no attribute 'many_to_many' 
+0

Вы можете разместить отслеживающий? и ваш ModelForm. Мне любопытно, что пытается получить доступ к 'many_to_many' ... –

+0

@YujiTomita вот модель и трассировка –

+0

@YujiTomita получил это! Я передал форму как параметр для этой строки 'item_info_form = ItemInfoForm (instance = item_form)'. Должно быть 'item_info_form = ItemInfoForm (instance = item_info)'. Кто-то, пожалуйста, напишите это как ответ, чтобы я мог пометить его. Должен помочь другой неуклюжий аз, как я. –

ответ

2

You создают экземпляр ItemInfoForm с экземпляром ItemForm. Хотя instance должен быть ItemInfo экземпляр, не образуют

Правильная линия:

item_info_form = ItemInfoForm(instance=item_info) 
Смежные вопросы