Я работаю над библиотечной системой для управления определенными элементами в нашем офисе, мне не нужна полноценная интегрированная библиотечная система, поэтому я решил сделать одну ручную работу с Django.
Ниже приведен упрощенныйверсия моей модели:
class ItemObjects(models.Model):
# Static Variables
IN_STATUS = 'Available'
OUT_STATUS = 'Checked out'
MISSING = 'Missing'
STATUS_CHOICES = (
(IN_STATUS, 'Available'),
(OUT_STATUS, 'Checked out'),
(MISSING, 'Missing'),
)
# Fields
slug = models.SlugField(unique=True)
date_added = models.DateField(auto_now_add=True)
last_checkin = models.DateTimeField(editable=False, null=True)
last_checkout = models.DateTimeField(editable=False, null=True)
last_activity = models.DateTimeField(editable=False, null=True)
status = models.CharField(choices=STATUS_CHOICES, default=IN_STATUS, max_length=25)
who_has = models.OneToOneField(User, blank=True, null=True)
times_out = models.PositiveIntegerField(default=0, editable=False)
notes = models.CharField(blank=True, max_length=500)
history = models.TextField(blank=True, editable=False)
pending_checkin = models.BooleanField(default=False)
pending_transfer = models.BooleanField(default=False)
Сначала я использовал метод на ItemObject
для обработки извлечения элемента у пользователя, а who_has
был EmailField
, потому что я не мог получитьCharfField
для заполнения именем пользователя, вошедшего в систему, но я решил, что использование OneToOneField
, вероятно, ближе к «правильному» способу сделать это. Хотя who_has
был EmailField
, работал следующий метод:
def check_out_itemobject(self, user):
user_profile = user.get_profile()
if self.status == 'Available' and self.who_has == '':
self.status = 'Checked out'
self.who_has = user.email
self.last_checkout = datetime.datetime.now()
self.last_activity = datetime.datetime.now()
self.times_out += 1
if self.history == '':
self.history += "%s" % user_profile.full_name
else:
self.history += ", %s" % user_profile.full_name
if user_profile.history == '':
user_profile.history += self.title
else:
user_profile.history += ", %s" % self.title
else:
return False # Not sure is this is "right"
user_profile.save()
super(ItemObjects, self).save()
Теперь, когда я использую OneToOneField
, это не работает, поэтому я начал смотреть на использование подкласса ModelForm
, но ни один из случаев, которые я видел здесь на SO, казалось, не подходит дляЯ пытаюсь сделать;моя форма была бы кнопкой, и все тут.Вот некоторые из вопросов, на которые я смотрел:
Django: сохранение нескольких моделей одновременно (сложный случай)
(Django) (проблемы с внешними ключами).person_id Не может быть NULL
Обновление модели django
Так что я был на правильном пути с каким-то измененным методом save () илиПодкласс ModelForm будет подходить?
РЕДАКТИРОВАТЬ / ОБНОВИТЬ: Большое спасибо @ChrisPratt!
Так что я пытаюсь заставить предложение Криса Пратта показать ItemHistory работать, но когда я пытаюсьвизуализировать его на странице, я получаю AttributeError
, который утверждает, что «объект« Пользователь »не имеет атрибута« отметка времени »».Поэтому мой вопрос: почему он жалуется на объект User
, когда last_activity
является атрибутом объекта ItemObject
?
Мой взгляд:
@login_required
def item_detail(request, slug):
item = get_object_or_404(Item, slug=slug)
i_history = item.last_activity
user = request.user
return render_to_response('items/item_detail.html',
{ 'item' : item,
'i_history': i_history,
'user' : user })
Я непонять, почему в этот момент появляется объект User
.
EDIT2: не имеет значения, история - это явно поле M2M, целью которого является пользователь.Вот почему!