【发布时间】:2011-11-18 15:56:40
【问题描述】:
我正在开发一个图书馆系统来管理我们办公室的某些项目,我不需要一个成熟的集成图书馆系统,所以我决定用 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 的子类,但我在这里看到的所有案例似乎都不适用于我正在尝试做的事情;我的表单将是一个按钮,就是这样。以下是我查看的一些问题:
Django: saving multiple modelforms simultaneously (complex case)
(Django) (Foreign Key Issues) model.person_id May not be NULL
那么我是在正确的轨道上使用一种改变的 save() 方法,还是 ModelForm 子类是要走的路?
编辑/更新:非常感谢@ChrisPratt!
所以我试图让 Chris Pratt 的建议显示 ItemHistory 工作,但是当我尝试在页面上呈现它时,我得到一个 AttributeError ,指出“'用户'对象没有属性'时间戳'”。所以我的问题是,当last_activity 是ItemObject 对象的属性时,为什么它会抱怨User 对象?
我的看法:
@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 字段,其目标是用户。这就是为什么!
【问题讨论】:
标签: python django forms checkout