Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Ошибка при добавлении записи в модель. [RSS Feed]

#1 Июнь 22, 2011 11:36:42

Kotakota
От:
Зарегистрирован: 2011-06-06
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при добавлении записи в модель.

Спасибо большое!
С помощью Ваших советов я не теряю веры, что стану джанго-гуру :)
Но я упорно не понимаю такую вещь.
Вот например модель:

class Image(models.Model):
image_author = models.ForeignKey(User)
image_title = models.CharField(max_length=30)
image_description = models.TextField(blank=True)
image_pubdate = models.DateTimeField(auto_now_add=True)
image_source = models.ImageField(upload_to='images/')
image_tags = models.ManyToManyField(Tag,blank=True)
def __unicode__(self):
return '%s (%s)' % (self.image_title, self.image_author)
Как Вы мне посоветовали я сделал вставку новой записи так:

def save(self):
#Вот здесь!
#--------------------------
try:
author = User.objects.get(username=self.cleaned_data["author"])
except User.DoesNotExist:
return
#----------------------------
title = self.cleaned_data["title"]
describe = self.cleaned_data["describe"]
firstfile = self.cleaned_data["firstfile"]
from RandomQuote.quotes.models import Image
image = Image(image_author=author,
image_title=title,
image_description=describe,
image_source = firstfile
)
image.save()
image.image_tags = self.cleaned_data["tags"]
image.save()
Все заработало.
Я не понимаю как эти таблицы связываются?
Если выполнить в шелле, например:
>>> author = User.objects.get(username='root')
вернет: root
получается: image_author = root
Но ведь первичный ключ в таблице auth_user Django это id, а получается мы связываем таблицы по полю username таблицы auth_user?

У меня снова возникла проблема при вставке информации в модель комментариев :(
Никак не могу понять как связываются таблицы, по какому полю?

Есть модель:
class Comment(models.Model):
comment_author = models.ForeignKey(User)
comment_image = models.ForeignKey(Image)
comment_title = models.CharField(max_length=50)
comment_pubdate = models.DateTimeField(auto_now_add=True)
comment_text = models.TextField()
def __unicode__(self):
return '%s (%s)' % (self.comment_title, self.comment_author)
Есть html форма:
<form action="comments/" method="POST">
{% csrf_token %}
<input type="hidden" name="authorr" value="{{ user.username }}">
<TABLE cellpadding="0" cellspacing="0" border="0" style="border-width:1px; border-spacing: 2px;
border-style: none; border-color: green; border-collapse: collapse;background-color: white;">
<TR><TD><label for="id_messagename">Название:</label></TD><TD><input type="text" size=20 name="messagename" id="id_messagename" /></TD></TR>
<TR><TD><label for="id_message">Сообщение:</label></TD><TD><textarea rows="10" cols="20" name="message" id="id_message"></textarea> </TD></TR>
<TR><TD colspan="2" align="right"><input type="submit" value="Отправить!"/></TD></TR>
</TABLE>
<input type="hidden" name="picturenumber" value="{{ images.id }}">
</form>
views.py
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from RandomQuote.comments.forms import CommentsForm

def addComments(request):
if request.method == 'POST':
form = CommentsForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/')
else:
return HttpResponseRedirect('/')
else:
return HttpResponseRedirect('/')
forms.py
from django import forms
from RandomQuote.quotes.models import Image
from django.contrib.auth.models import User

class CommentsForm(forms.Form):
author = forms.CharField()
image = forms.CharField()
title = forms.CharField()
text = forms.CharField()

def save(self):
try:
author = User.objects.get(username=self.cleaned_data["authorr"])
except User.DoesNotExist:
return

try:
image = Image.objects.get(pk=self.cleaned_data["picturenumber"])
except Image.DoesNotExist:
return

#image = self.cleaned_data["picturenumber"]
title = self.cleaned_data["messagename"]
text = self.cleaned_data["message"]
from RandomQuote.quotes.models import Comment
Comment(comment_author=author,
comment_image=image,
comment_title=title,
comment_text = text
).save()
Пытаюсь прописать id картинки на которую ссылается данный комментарий
try:
image = Image.objects.get(pk=self.cleaned_data["picturenumber"])
except Image.DoesNotExist:
return
Номер текущей показанной картинки сохранен в
<input type="hidden" name="picturenumber" value="{{ images.id }}">



Офлайн

#2 Июнь 22, 2011 11:38:05

Kotakota
От:
Зарегистрирован: 2011-06-06
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при добавлении записи в модель.

Спасибо большое!
С помощью Ваших советов я не теряю веры, что стану джанго-гуру :)
Но я упорно не понимаю такую вещь.
Вот например модель:

class Image(models.Model):
image_author = models.ForeignKey(User)
image_title = models.CharField(max_length=30)
image_description = models.TextField(blank=True)
image_pubdate = models.DateTimeField(auto_now_add=True)
image_source = models.ImageField(upload_to='images/')
image_tags = models.ManyToManyField(Tag,blank=True)
def __unicode__(self):
return '%s (%s)' % (self.image_title, self.image_author)
Как Вы мне посоветовали я сделал вставку новой записи так:

def save(self):
#Вот здесь!
#--------------------------
try:
author = User.objects.get(username=self.cleaned_data["author"])
except User.DoesNotExist:
return
#----------------------------
title = self.cleaned_data["title"]
describe = self.cleaned_data["describe"]
firstfile = self.cleaned_data["firstfile"]
from RandomQuote.quotes.models import Image
image = Image(image_author=author,
image_title=title,
image_description=describe,
image_source = firstfile
)
image.save()
image.image_tags = self.cleaned_data["tags"]
image.save()
Все заработало.
Я не понимаю как эти таблицы связываются?
Если выполнить в шелле, например:
>>> author = User.objects.get(username='root')
вернет: root
получается: image_author = root
Но ведь первичный ключ в таблице auth_user Django это id, а получается мы связываем таблицы по полю username таблицы auth_user?

У меня снова возникла проблема при вставке информации в модель комментариев :(
Никак не могу понять как связываются таблицы, по какому полю?

Есть модель:
class Comment(models.Model):
comment_author = models.ForeignKey(User)
comment_image = models.ForeignKey(Image)
comment_title = models.CharField(max_length=50)
comment_pubdate = models.DateTimeField(auto_now_add=True)
comment_text = models.TextField()
def __unicode__(self):
return '%s (%s)' % (self.comment_title, self.comment_author)
Есть html форма:
<form action="comments/" method="POST">
{% csrf_token %}
<input type="hidden" name="authorr" value="{{ user.username }}">
<TABLE cellpadding="0" cellspacing="0" border="0" style="border-width:1px; border-spacing: 2px;
border-style: none; border-color: green; border-collapse: collapse;background-color: white;">
<TR><TD><label for="id_messagename">Название:</label></TD><TD><input type="text" size=20 name="messagename" id="id_messagename" /></TD></TR>
<TR><TD><label for="id_message">Сообщение:</label></TD><TD><textarea rows="10" cols="20" name="message" id="id_message"></textarea> </TD></TR>
<TR><TD colspan="2" align="right"><input type="submit" value="Отправить!"/></TD></TR>
</TABLE>
<input type="hidden" name="picturenumber" value="{{ images.id }}">
</form>
views.py
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from RandomQuote.comments.forms import CommentsForm

def addComments(request):
if request.method == 'POST':
form = CommentsForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/')
else:
return HttpResponseRedirect('/')
else:
return HttpResponseRedirect('/')
forms.py
from django import forms
from RandomQuote.quotes.models import Image
from django.contrib.auth.models import User

class CommentsForm(forms.Form):
author = forms.CharField()
image = forms.CharField()
title = forms.CharField()
text = forms.CharField()

def save(self):
try:
author = User.objects.get(username=self.cleaned_data["authorr"])
except User.DoesNotExist:
return

try:
image = Image.objects.get(pk=self.cleaned_data["picturenumber"])
except Image.DoesNotExist:
return

#image = self.cleaned_data["picturenumber"]
title = self.cleaned_data["messagename"]
text = self.cleaned_data["message"]
from RandomQuote.quotes.models import Comment
Comment(comment_author=author,
comment_image=image,
comment_title=title,
comment_text = text
).save()
Пытаюсь прописать id картинки на которую ссылается данный комментарий
try:
image = Image.objects.get(pk=self.cleaned_data["picturenumber"])
except Image.DoesNotExist:
return
Номер текущей показанной картинки сохранен в
<input type="hidden" name="picturenumber" value="{{ images.id }}">



Офлайн

#3 Июнь 22, 2011 12:56:38

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при добавлении записи в модель.

Kotakota
вернет: root
получается: image_author = root
Но ведь первичный ключ в таблице auth_user Django это id, а получается мы связываем таблицы по полю username таблицы auth_user?
author это обьект. Мы просто ищем его в БД по username.
'root' - возвращает author.__unicode__(), вызываемый когда нужно отобразить объект где-нибудь.
под капотом джанга создаст связь по pk.
Что-бы связать по другому полю нужно явно указать to_field.
До конца не понял с чем собственно у вас проблема.

ЗЫ: уберите дублирующий пост.



Офлайн

#4 Июнь 23, 2011 08:23:34

Kotakota
От:
Зарегистрирован: 2011-06-06
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при добавлении записи в модель.

pill
Kotakota
вернет: root
получается: image_author = root
Но ведь первичный ключ в таблице auth_user Django это id, а получается мы связываем таблицы по полю username таблицы auth_user?
author это обьект. Мы просто ищем его в БД по username.
'root' - возвращает author.__unicode__(), вызываемый когда нужно отобразить объект где-нибудь.
под капотом джанга создаст связь по pk.
Что-бы связать по другому полю нужно явно указать to_field.
До конца не понял с чем собственно у вас проблема.

ЗЫ: уберите дублирующий пост.
Проблема такая:
Модель
from django.db import models
from django.contrib.auth.models import User

class Tag(models.Model):
tag_name = models.CharField(max_length=30)
def __unicode__(self):
return self.tag_name

class Image(models.Model):
image_author = models.ForeignKey(User)
image_title = models.CharField(max_length=30)
image_description = models.TextField(blank=True)
image_pubdate = models.DateTimeField(auto_now_add=True)
image_source = models.ImageField(upload_to='images/')
image_tags = models.ManyToManyField(Tag,blank=True)
def __unicode__(self):
return '%s (%s)' % (self.image_title, self.image_author)

class Comment(models.Model):
comment_author = models.ForeignKey(User)
comment_image = models.ForeignKey(Image)
comment_title = models.CharField(max_length=50)
comment_pubdate = models.DateTimeField(auto_now_add=True)
comment_text = models.TextField()
def __unicode__(self):
return '%s (%s)' % (self.comment_title, self.comment_author)
Запускаю: python manage.py shell и пишу:

>>> from RandomQuote.quotes.models import Tag
>>> from django.contrib.auth.models import User
>>> from RandomQuote,qoutes.models import Image
>>> from RandomQuote,qoutes.models import Comment

author = User.objects.get(username='root')
image = Image.objects.get(pk=7)

Comment(comment_author=author, comment_image=image, comment_title='title', comment_text='text').save()

И не работает:

AttributeError: ‘Comment’ object has no attribute ‘comment_author_id’



Офлайн

#5 Июнь 23, 2011 10:03:39

Kotakota
От:
Зарегистрирован: 2011-06-06
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при добавлении записи в модель.

Comment(comment_author=author, comment_image=image, comment_title='title', comment_text='text').save()
Наверное когда вызываешь в конце метод save(), Django пытается записать информацию в БД, а видимо из shell'a этого не сделать,
поэтому ругается на отсутствие аттрибута.
Когда сохраняется с помощью POST на сайте, все работает.
Правильная эта мысль или нет?

И еще хочу сказать, как Вы были правы когда говорили, что не стоит самому писать форму.
Это касается моего поста выше о том, что я не могу сохранить форму, и я ошибся вот в чем:
from django import forms
from RandomQuote.quotes.models import Image
from django.contrib.auth.models import User

class CommentsForm(forms.Form):
authorr = forms.CharField()
picturenumber = forms.IntegerField()
messagename = forms.CharField()
message = forms.CharField()

def save(self):
try:
authorr = User.objects.get(username=self.cleaned_data["authorr"])
except User.DoesNotExist:
return

try:
picturenumber = Image.objects.get(pk=self.cleaned_data["picturenumber"])
except Image.DoesNotExist:
return

#image = self.cleaned_data["picturenumber"]
messagename = self.cleaned_data["messagename"]
message = self.cleaned_data["message"]
from RandomQuote.quotes.models import Comment
Comment(comment_author=authorr,
comment_image=picturenumber,
comment_title=messagename,
comment_text = message
).save()
Поля в forms.py:
authorr = forms.CharField()
picturenumber = forms.IntegerField()
messagename = forms.CharField()
message = forms.CharField()
должны называться так-же как они называются в HTML тегах:
<input type="hidden" name="authorr" value="{{ user.username }}">
<input type="text" size=20 name="messagename" id="id_messagename" />
<textarea rows="10" cols="20" name="message" id="id_message"></textarea>
<input type="hidden" name="picturenumber" value={{ images.id }}>
Раньше они у меня назывались:
    author = forms.CharField()
image = forms.CharField()
title = forms.CharField()
text = forms.CharField()
Из-за этого ничего не работало…

Спасибо!



Отредактировано (Июнь 23, 2011 10:06:03)

Офлайн

#6 Июнь 23, 2011 10:23:24

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при добавлении записи в модель.

Kotakota
Наверное когда вызываешь в конце метод save(), Django пытается записать информацию в БД, а видимо из shell'a этого не сделать,
поэтому ругается на отсутствие аттрибута.
Из shell'a все должно сохраняться.
И предпосылок к возникновению такой ошибки я не вижу… странно.

ЗЫ: Что-бы пост хоть какую-то полезную нагрузку нес:
В таких, как говориться, straightforward случаях очень удобно ModelForm использовать.



Офлайн

#7 Июнь 23, 2011 11:54:32

Kotakota
От:
Зарегистрирован: 2011-06-06
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при добавлении записи в модель.

Еще для полного понимания хотел прояснить следующий код:

from django import forms
from RandomQuote.quotes.models import Tag
from django.contrib.auth.models import User

class UploadFileForm(forms.Form):
author = forms.CharField()
title = forms.CharField()
describe = forms.CharField()
tags = forms.ModelMultipleChoiceField(Tag.objects.all())
firstfile = forms.ImageField()

def save(self):
try:
author = User.objects.get(username=self.cleaned_data["author"])
except User.DoesNotExist:
return
#author = self.cleaned_data["author"]
title = self.cleaned_data["title"]
describe = self.cleaned_data["describe"]
firstfile = self.cleaned_data["firstfile"]
from RandomQuote.quotes.models import Image
image = Image(image_author=author,
image_title=title,
image_description=describe,
image_source = firstfile
)
image.save()
image.image_tags = self.cleaned_data["tags"]
image.save()
Здесь мы сначала сохраняем все, кроме поля image_tags.
После этого, когда с помощью нашего предыдущего сохранения нам присвоился PK в базе, тоесть мы теперь можем вызвать id того рисунка который добавили, мы связываем этот id в промежуточной таблице с id выбранных тегов.
Правильно?
И еще небольшой вопрос:
tags = forms.ModelMultipleChoiceField(Tag.objects.all())
Если то, что мы выбрали на странице в теге <select> не попадает в этот список тегов, то при валидации формы мы получим FALSE?



Отредактировано (Июнь 23, 2011 11:56:21)

Офлайн

#8 Июнь 23, 2011 12:32:33

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при добавлении записи в модель.

Kotakota
Здесь мы сначала сохраняем все, кроме поля image_tags…
Да, где-то так.
Kotakota
И еще небольшой вопрос:
Да, form.is_valid() вернет False



Офлайн

#9 Июнь 23, 2011 12:37:51

Kotakota
От:
Зарегистрирован: 2011-06-06
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при добавлении записи в модель.

pill
Kotakota
Здесь мы сначала сохраняем все, кроме поля image_tags…
Да, где-то так.
Kotakota
И еще небольшой вопрос:
Да, form.is_valid() вернет False
Спасибо!
Будем изучать дальше, есть еще много чего интересного!

P.S. Из shella тоже все работает. Сейчас еще раз попробовал!
Видимо что то, напутал в первый раз.



Отредактировано (Июнь 23, 2011 13:17:01)

Офлайн

  • Начало
  • » Django
  • » Ошибка при добавлении записи в модель.[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version