Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » ModelForm исключенные поля. Как включить через instance более одного поля. [RSS Feed]

#1 Окт. 21, 2012 10:52:05

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

ModelForm исключенные поля. Как включить через instance более одного поля.

Есть вот такие модели:

class GoodsDescription(models.Model):
    subtype = models.ForeignKey(SubGoodsType, unique=False)
    basket = models.ManyToManyField(User, unique=False, null=True, blank=True)
    title = models.CharField(max_length=50, unique=False)
    articul = models.CharField(max_length=15, unique=False)
    image = models.ImageField(upload_to="description")
    description = models.TextField(max_length=4000)
    characteristics = models.TextField(max_length=4000, unique=False, null=True, blank=True)
    review = models.TextField(max_length=4000, unique=False, null=True, blank=True)
    number = models.IntegerField()
    price = models.CharField(max_length=15, unique=False, null=True, blank=True)
    def __unicode__(self):
        return self.title
class GoodsComments(models.Model):
    product = models.ForeignKey(GoodsDescription, unique=False)
    title = models.CharField(max_length=50, unique=False)
    body = models.TextField(max_length=400, unique=False)
    author = models.CharField(max_length=30, unique=False)
    timestamp = models.DateTimeField(auto_now_add=True, editable=False, unique=False)
    class Meta:
        ordering = ('-timestamp',)
class GoodsCommentsForm(ModelForm):
    class Meta:
        model = GoodsComments
        exclude = ('product','author',)

И представление:
def AddGoodsComment (request, self):
    if request.method == 'POST' and request.user.is_authenticated():
        try:
            username = request.user.username
            author = GoodsComments(author=username)
            product = GoodsComments(product=self)
            form = GoodsCommentsForm(request.POST, instance=(author, product))
            if form.is_valid():
                form.save()
                return HttpResponseRedirect("/catalog/")
        except:
            return HttpResponseRedirect("/catalog/")
    else:
        return HttpResponseRedirect("/catalog/")
В документации не встретил как передать в instance несколько значений, попробовал как-то так, но получилась ерунда.
Возвращается ошибка:
Cannot assign “u'3'”: “GoodsComments.product” must be a “GoodsDescription” instance.
Как включить в форму еще два значения?



_________
Новичок

Офлайн

#2 Окт. 21, 2012 11:35:29

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

ModelForm исключенные поля. Как включить через instance более одного поля.

instance - это инстанс (то есть объект) класса GoodsComments.
Если в базе уже есть соответствующая запись, то Вам нужно сделать get по автору и продукту.
То есть

username = request.user.username
product = GoodsDescription.objects.get(pk=...)
gc=GoodsComments.objects.get(product=product, author=author)
form = GoodsCommentsForm(request.POST, instance=gc)
Если же такой записи нет, то Вам нужен не инстанс, а initial



Отредактировано FishHook (Окт. 21, 2012 11:50:03)

Офлайн

#3 Окт. 21, 2012 11:37:18

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

ModelForm исключенные поля. Как включить через instance более одного поля.

author = models.CharField(max_length=30, unique=False)
Очень спорное решение, почему не
author = models.ForeignKey(User)
???



Офлайн

#4 Окт. 21, 2012 11:46:29

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

ModelForm исключенные поля. Как включить через instance более одного поля.

FishHook
author = models.CharField(max_length=30, unique=False)
Очень спорное решение, почему не
author = models.ForeignKey(User)
???
На момент составления модели я предполагал туда записывать имя автора, просто для того, что бы его потом вывести.
Хотя, пожалуй для дальнейшей работы лучше было бы связать с User.



_________
Новичок

Отредактировано SorrowFuck (Окт. 21, 2012 11:46:44)

Офлайн

#5 Окт. 21, 2012 11:56:25

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

ModelForm исключенные поля. Как включить через instance более одного поля.

FishHook
instance - это инстанс (то есть объект) класса GoodsComments.
Если в базе уже есть соответствующая запись, то Вам нужно сделать get по автору и продукту.
То есть
username = request.user.username
product = .....
gc=GoodsComments.objects.get(product=product, author=author)
form = GoodsCommentsForm(request.POST, instance=gc)
Если же такой записи нет, то Вам нужен не инстанс, а initial
На сколько я понял initial, строка с формой должна выгладить вот так:
form = GoodsCommentsForm(request.POST, initial = {
   'author': author,
   'product': product, 
})



_________
Новичок

Офлайн

#6 Окт. 21, 2012 12:01:09

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

ModelForm исключенные поля. Как включить через instance более одного поля.

Все верно



Офлайн

#7 Окт. 21, 2012 15:18:10

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

ModelForm исключенные поля. Как включить через instance более одного поля.

Есть еще вопрос, не по сабжу, но по этим же моделям и функции.

def AddGoodsComment (request, self):
    if request.method == 'POST' and request.user.is_authenticated():
            self = int(self)
            username = request.user.username
            author = GoodsComments(author=username)
            product = GoodsComments(product=self)
            form = GoodsCommentsForm(request.POST, initial = {
                'author': author,
                'product': product,
            })
            if form.is_valid():
                form.save()
                return HttpResponseRedirect("/catalog/")
    else:
        return HttpResponseRedirect("/catalog/")
При обращении к функции возвращает ошибку связанную с полем:
product = GoodsComments(product=self)

Cannot assign “3”: “GoodsComments.product” must be a “GoodsDescription” instance.

Я не совсем понимаю как в этой форме представить GoodsDescription, если заполняться должна именно модель GoodsComments.



_________
Новичок

Офлайн

#8 Окт. 21, 2012 16:55:36

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

ModelForm исключенные поля. Как включить через instance более одного поля.

Вы не понимаете что делаете, совсем не понимаете

author = GoodsComments(author=username)
product = GoodsComments(product=self)
Тут, Вы объявлете 2 инстанса одной модели. Как Вы хотите инициализировать форму этими инстансами, если Ваша форма сделана от модели, которая не содержит таких полей?

product = models.ForeignKey(GoodsDescription, unique=False)
title = models.CharField(max_length=50, unique=False)
body = models.TextField(max_length=400, unique=False)
author = models.CharField(max_length=30, unique=False)


product - это GoodsDescription,
author - это CahrField

как по Вашему должно это работать вообще?

author = GoodsComments(author=username)
product = GoodsComments(product=self)



Офлайн

#9 Окт. 21, 2012 17:12:43

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

ModelForm исключенные поля. Как включить через instance более одного поля.

FishHook
Вы не понимаете что делаете, совсем не понимаете

author = GoodsComments(author=username)
product = GoodsComments(product=self)
Тут, Вы объявлете 2 инстанса одной модели. Как Вы хотите инициализировать форму этими инстансами, если Ваша форма сделана от модели, которая не содержит таких полей?

product = models.ForeignKey(GoodsDescription, unique=False)
title = models.CharField(max_length=50, unique=False)
body = models.TextField(max_length=400, unique=False)
author = models.CharField(max_length=30, unique=False)


product - это GoodsDescription,
author - это CahrField

как по Вашему должно это работать вообще?

author = GoodsComments(author=username)
product = GoodsComments(product=self)
Меня запутало то, что я полез в БД и увидел там поле product_id которое было создано в соответствие с полем модели product.
В таком случае как я понимаю product дает только возможность обращаться к полям GoodsDescription.
Тогда что бы сделать привязку записи к определенному id из GoodsDescription мне нужно создавать дополнительное поле и потом все связывать в представлении через запросы?



_________
Новичок

Офлайн

  • Начало
  • » Django
  • » ModelForm исключенные поля. Как включить через instance более одного поля.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version