import pprint
assert False, pprint.pformat(object)
assert False, pprint.pformat(object.__dict__)
assert False, pprint.pformat(object.__dict__.keys())
assert False, pprint.pformat(object.__dict__.values())
django debug
Простий і швидкий варіант переглянути вміст змінної, кортежу, об'єкту...:
джоіни
є моделі:
треба зробити вибірку з TaskStatus але відфільтрувати по Task.buyer, тобто зробити JOIN-запит. Порився трошки в гуглі, не особливо щось знайшов. От і думаю, вот ORM не така вже універсальна! Але стандартні засоби все ж є:
class Task(models.Model):
name = models.CharField(max_length=120)
buyer = models.ForeignKey(Profile, related_name='buyer')
class TaskStatus(models.Model):
POSTED, ASSIGNED, COMPLETED, CLOSED = range(1,5)
TASK_STATUS_VALUES = (
(POSTED, 'Posted'),
(ASSIGNED, 'Assigned'),
(COMPLETED, 'Completed'),
(CLOSED, 'Closed'),
)
task = models.ForeignKey(Task)
task_status = models.IntegerField(choices=TASK_STATUS_VALUES, blank=True, null=True)
треба зробити вибірку з TaskStatus але відфільтрувати по Task.buyer, тобто зробити JOIN-запит. Порився трошки в гуглі, не особливо щось знайшов. От і думаю, вот ORM не така вже універсальна! Але стандартні засоби все ж є:
TaskStatus.objects.filter(task__buyer=request.user)
django fixtures
Наскільки зручна річ...
Коли проект розростається, додаються нові аплікейшени і роширюються моделі, інколи простіше витерти чи обнулити файл бази даних. Тоді з нуля потрібно заводити користувачів, постити якісь дані, на що йде додатковий час. Фікстури дозволяють при manage.py syncdb догружати потрібні дані.
Для цього в потрібному аплікейшені створюємо каталог fixtures і зберігаємо JSON (також можливі інші формати) файл даних з іменем initial_data.json
Для того щоб зробити повний дамп даних проекту, потрібно виконати manage.py dumpdata > dump.json Потім я в PyCharm привожу код до читабельного вигляду, вирізаю потрібні дані і роблю вищеописані дії.
Приклад:
чим додаємо гурт і права до нього
Коли проект розростається, додаються нові аплікейшени і роширюються моделі, інколи простіше витерти чи обнулити файл бази даних. Тоді з нуля потрібно заводити користувачів, постити якісь дані, на що йде додатковий час. Фікстури дозволяють при manage.py syncdb догружати потрібні дані.
Для цього в потрібному аплікейшені створюємо каталог fixtures і зберігаємо JSON (також можливі інші формати) файл даних з іменем initial_data.json
Для того щоб зробити повний дамп даних проекту, потрібно виконати manage.py dumpdata > dump.json Потім я в PyCharm привожу код до читабельного вигляду, вирізаю потрібні дані і роблю вищеописані дії.
Приклад:
[
{
"pk": 64,
"model": "auth.permission",
"fields": {
"codename": "add_attachment",
"name": "Can add attachment",
"content_type": 22
}
},
{
"pk": 65,
"model": "auth.permission",
"fields": {
"codename": "change_attachment",
"name": "Can change attachment",
"content_type": 22
}
},
{
"pk": 66,
"model": "auth.permission",
"fields": {
"codename": "delete_attachment",
"name": "Can delete attachment",
"content_type": 22
}
},
{
"pk": 67,
"model": "auth.permission",
"fields": {
"codename": "delete_foreign_attachments",
"name": "Can delete foreign attachments",
"content_type": 22
}
},
{
"pk": 1,
"model": "auth.group",
"fields": {
"name": "attachments",
"permissions": [64, 65, 66, 67]
}
},
]
чим додаємо гурт і права до нього
керування користувачами, гуртами та правами
Досить мало про це написано в документації.
Наглядний приклад: http://parand.com/say/index.php/2010/02/19/django-using-the-permission-system/
Наглядний приклад: http://parand.com/say/index.php/2010/02/19/django-using-the-permission-system/
int значення в radio форму

class ReviewForm(ModelForm):
RATING_CHOICES = ((1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5'),)
rate = forms.TypedChoiceField(choices=RATING_CHOICES, \
widget=forms.RadioSelect, coerce=int)
def clean_rate(self):
if self.cleaned_data['rate'] >= 1 and self.cleaned_data['rate'] <= 5:
return self.cleaned_data['rate']
else:
raise forms.ValidationError(_("Rating error"))
class Meta:
model = Reviews
fields = ('rate', 'message', 'content_type', 'object_id')
widgets = {
'content_type' : forms.HiddenInput(),
'object_id' : forms.HiddenInput()
}
Передавання у формах значень у вигляді hidden полей
Є модель
при роботі з формами треба object_id і object_id передавати у hidden полях і також ініціалізувати їх при створенні форми.
forms.py
views.py
class Reviews(models.Model):
object_id = models.PositiveIntegerField(_('object id'))
content_type = models.ForeignKey(ContentType, verbose_name=_('content type'))
object = GenericForeignKey('content_type', 'object_id')
rate = models.DecimalField(decimal_places=1, max_digits=2)
user = models.ForeignKey(User, verbose_name=_('user'))
message = models.TextField(_('message'))
timestamp = models.DateTimeField(_('timestamp'), auto_now_add=True)
def __unicode__(self):
return unicode(self.user)
при роботі з формами треба object_id і object_id передавати у hidden полях і також ініціалізувати їх при створенні форми.
forms.py
class ReviewForm(ModelForm):
class Meta:
model = Reviews
fields = ('rate', 'message', 'content_type', 'object_id')
widgets = {
'content_type' : forms.HiddenInput(),
'object_id' : forms.HiddenInput()
}
views.py
if request.method == "POST":
form = ReviewForm(request.POST)
if form.is_valid():
r = form.save(commit=False)
r.user = request.user
r.save()
return redirect('home')
else:
ct = ContentType.objects.get_for_model(user)
form = ReviewForm(initial={'content_type': ct.pk, 'object_id': user.id})
coercing to Unicode: need string or buffer, Task found
Цікаву САБЖ помилку дебажив.
лікується:
class Task(models.Model):
name = models.CharField(max_length=120)
description = models.TextField()
price = models.DecimalField(max_digits=5, decimal_places=2)
buyer = models.ForeignKey(User, related_name='buyer')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.name
class TaskStatus(models.Model):
POSTED, ASSIGNED, COMPLETED, CLOSED = range(1,5)
TASK_STATUS_VALUES = (
(POSTED, 'Posted'),
(ASSIGNED, 'Assigned'),
(COMPLETED, 'Completed'),
(CLOSED, 'Closed'),
)
task = models.ForeignKey(Task)
task_status = models.IntegerField(choices=TASK_STATUS_VALUES, blank=True, null=True)
provider = models.ForeignKey(User, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return self.task
лікується:
def __unicode__(self):
return unicode(self.task)
Підписатися на:
Дописи (Atom)