Django - 将我的模型链接到配置文件(UserProfile)模型
我正在尝试创建一个小应用程序,供用户建立联系。我使用 django-profiles 作为我的配置文件的基础。现在一切正常,直到我尝试提交编辑联系表单并收到此错误。
Cannot assign "<Contact: Contact object>": "Contact.user" must be a "UserProfile" instance.
作为 Django 的新手,我什至不确定我在这里是否采取了正确的方法。我的最终目标是让用户能够根据需要添加尽可能多的联系人。 任何建议表示赞赏。
我的 UserProfile 模型扩展了 User 看起来像:
class UserProfile(models.Model):
#User's Info
user = models.ForeignKey(User, unique=True)
first_name = models.CharField("first name", max_length=30)
last_name = models.CharField("last name", max_length=30)
home_address = models.CharField(max_length=50)
primary_phone = PhoneNumberField()
city = models.CharField(max_length=50)
state = USStateField()
zipcode = models.CharField(max_length=5)
birth_date = models.DateField()
gender = models.CharField(max_length=1, choices=GENDER_CHOICES, blank=True)
我的联系人模型看起来像这样:
class Contact(models.Model):
user = models.ForeignKey(UserProfile)
contact_description = models.CharField("Relation or Description of Contact", max_length=50, blank=True)
contact_first_name = models.CharField("contact first name", max_length=30)
contact_last_name = models.CharField("contact last name", max_length=30)
contact_primary_phone = PhoneNumberField("contact primary phone number")
contact_secondary_phone = PhoneNumberField("contact secondary phone number",blank=True)
我的观点:
def editContact(request, username, object_id=False, template_name='contacts/edit.html'):
user = UserProfile.user
AddContactFormset = inlineformset_factory(UserProfile,Contact, extra=1)
if object_id:
contact=Contact.objects.get(pk=object_id)
else:
contact=Contact()
if request.method == 'POST':
f= ContactForm(request.POST, request.FILES, instance=contact)
fs = AddContactFormset(request.POST, instance=contact)
if fs.is_valid() and f.is_valid():
f.save()
fs.save()
return HttpResponse('success')
else:
f = ContactForm(instance=contact)
fs = AddContactFormset(instance=contact)
return render_to_response(template_name ,{'fs':fs,'f':f,'contact': contact}, context_instance=RequestContext(request))
I'm trying to create a small app for users to have contacts. I'm using django-profiles as a base for my profiles. Now everything works well until I try to submit the edit contact form and I receive this error.
Cannot assign "<Contact: Contact object>": "Contact.user" must be a "UserProfile" instance.
Being pretty new to Django, I'm not even sure if I'm taking the right approach here. My end goal is for the user to be able to add as many contacts as neccessary.
Any advice is appreciated.
My UserProfile model which extends User looks like:
class UserProfile(models.Model):
#User's Info
user = models.ForeignKey(User, unique=True)
first_name = models.CharField("first name", max_length=30)
last_name = models.CharField("last name", max_length=30)
home_address = models.CharField(max_length=50)
primary_phone = PhoneNumberField()
city = models.CharField(max_length=50)
state = USStateField()
zipcode = models.CharField(max_length=5)
birth_date = models.DateField()
gender = models.CharField(max_length=1, choices=GENDER_CHOICES, blank=True)
and my contact model looks like this:
class Contact(models.Model):
user = models.ForeignKey(UserProfile)
contact_description = models.CharField("Relation or Description of Contact", max_length=50, blank=True)
contact_first_name = models.CharField("contact first name", max_length=30)
contact_last_name = models.CharField("contact last name", max_length=30)
contact_primary_phone = PhoneNumberField("contact primary phone number")
contact_secondary_phone = PhoneNumberField("contact secondary phone number",blank=True)
and my view:
def editContact(request, username, object_id=False, template_name='contacts/edit.html'):
user = UserProfile.user
AddContactFormset = inlineformset_factory(UserProfile,Contact, extra=1)
if object_id:
contact=Contact.objects.get(pk=object_id)
else:
contact=Contact()
if request.method == 'POST':
f= ContactForm(request.POST, request.FILES, instance=contact)
fs = AddContactFormset(request.POST, instance=contact)
if fs.is_valid() and f.is_valid():
f.save()
fs.save()
return HttpResponse('success')
else:
f = ContactForm(instance=contact)
fs = AddContactFormset(instance=contact)
return render_to_response(template_name ,{'fs':fs,'f':f,'contact': contact}, context_instance=RequestContext(request))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
基本上,django-profiles 是有其他用途的 - 它只是帮助在应用程序中创建和管理用户配置文件。
首先 - 您应该通过foreignkey将
Contact
模型直接链接到django.contrib.auth.models.User
。这样您就可以通过简单的查询访问给定用户的联系人,即。User.contact_set.all()
- 它将返回给您用户的联系人列表。这也将消除你的错误。其次 - 像
first_name
、last_name
这样的字段已经在django.contrib.auth.models.User
中定义,所以不需要定义它们再次在UserProfile
中。 此处阅读用户模型的源代码第三 - 如果您的用户只能有一个配置文件,并且您不打算使用非常旧版本的 django,那么您应该使用
OneToOneField
而不是ForeignKey
。第四件事 - 您可能可以通过使用与 django 捆绑在一起的通用视图之一来省略
RequestContext()
的使用 - 阅读有关 这里最后一件事 - 请记住,处理用户的主要模型是
User
模型本身。任何自定义配置文件都只是一个扩展,因此将与用户相关的所有内容链接到用户模型本身。快乐编码!
Basically, django-profiles is for something else - it's just helping to create and manage user profiles across an application.
First of all - you should link
Contact
models directly to thedjango.contrib.auth.models.User
via ForeignKey. This way you can access given User's contacts by a simple query ie.User.contact_set.all()
- it will return to you a list of User's contacts. This will also get rid off your error.Second - fields like
first_name
,last_name
are already definied indjango.contrib.auth.models.User
, so there is no need to define them again inUserProfile
. Read the source of User model hereThird - if your user can only have one Profile and you're not intend to use very old versions of django then you should be using
OneToOneField
instead ofForeignKey
.Fourth thing - you could probably omit usage of
RequestContext()
by using one of the generic views bundled with django - read about that hereLast thing - remember that main model for handling the Users is the
User
model itself. Any custom Profile is just an extension, so link everything which is related to the User to the User model itself.Happy coding!
要详细说明 bx2 的回答,您的联系人模型应该看起来更像这样:
坦率地说,你的观点没有多大意义。一般来说,内联表单集旨在表示与某些父记录相关的记录。在您的情况下,它将是用户记录,联系人是“儿童”记录。但是同时拥有联系人表单和 AddContactFormset 并没有多大意义。
另外,我建议不要在 Django 中使用
f
和fs
等变量名称。除了索引、计数器等变量之外,使用 1-2 个字符的短变量名称没有任何作用。继续使用更长的变量名称,例如form
和formset
,甚至contact_form
和contact_formset
。它使得将来调试代码变得更加容易。To elaborate on bx2's answer, your Contact model should look more like this:
Your view, frankly, does not make much sense. In general an inline formset is meant to represent records related to some parent record. In your case, it would be the user record, with the contacts being the "children" records. But having both a Contact form and an AddContactFormset doesn't make a lot of sense.
Also, I'd recommend against using variable names like
f
andfs
in Django. Apart from variables like indexes, counters, etc. it doesn't serve any purpose to use short 1-2 character variable names. Go ahead and use longer variable names likeform
andformset
, or evencontact_form
andcontact_formset
. It makes it much, much easier to debug the code in the future.