我正在尝试为用户创建一个小型应用以获得联系人。我使用django-profiles作为我的个人资料的基础。现在一切正常,直到我尝试提交编辑联系表单并收到此错误。
Cannot assign "<Contact: Contact object>": "Contact.user" must be a "UserProfile" instance.
对Django来说很新,我甚至不确定我是否采取了正确的方法。我的最终目标是让用户能够添加尽可能多的联系人。 任何建议都表示赞赏。
扩展用户的我的UserProfile模型如下所示:
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))
答案 0 :(得分:9)
基本上django-profiles用于其他方面 - 它只是帮助在应用程序中创建和管理用户配置文件。
首先,您应该通过ForeignKey将Contact
模型直接链接到django.contrib.auth.models.User
。这样,您可以通过简单的查询访问给定用户的联系人,即。 User.contact_set.all()
- 它将返回用户联系人列表。这也将摆脱你的错误。
第二个 - first_name
,last_name
等文件已在django.contrib.auth.models.User
中定义,因此无需在UserProfile
中再次定义它们。在此处阅读用户模型的来源:http://goo.gl/8oDv3
第三 - 如果您的用户只能拥有一个个人资料,并且您不打算使用非常旧版本的django,那么您应该使用OneToOneField
而不是ForeignKey
。
第四件事 - 您可以通过使用与django捆绑在一起的通用视图来省略RequestContext()
的使用 - 请在此处阅读:http://goo.gl/U4DWs
最后一件事 - 请记住,处理用户的主要模型是User
模型本身。任何自定义配置文件只是一个扩展,因此将与用户相关的所有内容链接到用户模型本身。
快乐的编码!
答案 1 :(得分:1)
要详细说明bx2's answer,您的联系人模型应该更像这样:
class Contact(models.Model):
user = models.ForeignKey(User, related_name='contacts')
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)
坦率地说,你的观点没有多大意义。通常,内联表单集表示与某些父记录相关的记录。在您的情况下,它将是用户记录,联系人是“子”记录。但是同时使用Contact表单和AddContactFormset并没有多大意义。
另外,我建议不要在Django中使用f
和fs
等变量名。除了索引,计数器等变量之外,它不能用于使用短1-2字符变量名。继续使用更长的变量名称,例如form
和formset
,甚至是contact_form
和contact_formset
。它使得将来调试代码变得更加容易。