Пояснения к OneToOneField, ManyToManyField и ManyToOneField в Django - PullRequest
1 голос
/ 31 января 2012

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

# 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() 

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

Редактировать: 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'

1 Ответ

2 голосов
/ 31 января 2012

Вы создаете экземпляр ItemInfoForm с ItemForm экземпляром.В то время как instance должно быть ItemInfo экземпляром, а не формой

Правильная строка:

item_info_form = ItemInfoForm(instance=item_info)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...