问题描述
我有一个简单的应用程序,我根据网上的大量信息构建了该应用程序,该应用程序围绕“书籍和作者”范式使用了 manytomany。我的模型有一个针对作者的自定义 Account 模型、一个书籍模型和一个直通表 - GroupMember 模型。
我希望作者能够登录并添加他们的图书,但我也希望如果一本书有两位作者,那么 GroupMember 将捕获该信息并在两位作者的个人资料中显示合着的图书。
目前,我使用 {{ p_form|crispy }} 在浏览器中正确显示了所有作者的个人资料信息,并且使用 objects.filter() 我只能按作者的名字查询书籍。我遇到的困难是将过滤后的书放入 b_form 中,以便一旦加载了作者个人资料,书名和出版年份就会出现在清晰的文本框中。现在这些文本框是空的 - 好消息是,如果我添加标题和年份,它们会成功添加到数据库中。但我想稍后我会添加一个单独的按钮来添加书籍功能。
我仍然需要找出在添加书籍时将组成员添加到通过 GroupMember 表的最佳方法,对此也可以使用一些想法。以下是一些主要代码片段:
Forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from account.models import Account,Book,GroupMember
class RegistrationForm(UserCreationForm):
email = forms.EmailField(max_length=60,help_text='required. Add a valid email address')
username = forms.CharField(max_length=100,help_text='Username required.')
class Meta:
model = Account
fields = ("email","username","password1","password2")
class ProfileUpdateForm(forms.ModelForm):
email = forms.EmailField()
class Meta:
model = Account
fields = ['email','username','first_name','last_name','image']
required_fields = fields
class BookUpdateForm(forms.ModelForm):
title = forms.CharField()
class Meta:
model = Book
fields = ['title','year']
required_fields = fields
views.py
def profile(request):
filtered_books = Book.objects.filter(link__first_name='John')
if request.method == 'POST':
b_form = BookUpdateForm(request.POST,filtered_books)
p_form = ProfileUpdateForm(request.POST,request.FILES,instance=request.user)
if p_form.is_valid():
b_form.save()
p_form.save()
messages.success(request,f'Your account has been updated!')
return redirect('profile')
else:
b_form = BookUpdateForm(instance=request.user)
p_form = ProfileUpdateForm(instance=request.user)
books = Book.objects.all()
members = GroupMember.objects.all()
context = {
'b_form': b_form,'p_form': p_form,'books': books,'members': members
}
return render(request,'authors/profile.html',context)
models.py
class Account(AbstractBaseUser):
email = models.EmailField(verbose_name="email",max_length=60,unique=True)
username = models.CharField(max_length=100,unique=True)
first_name = models.CharField(verbose_name="First Name",max_length=255,blank=True)
last_name = models.CharField(verbose_name="Last Name",blank=True)
phone_number = PhoneField(blank=True,help_text='Contact phone number')
is_author = models.BooleanField(verbose_name="Author",default=False)
is_admin = models.BooleanField(verbose_name="Administrator",default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(verbose_name="Staff",default=False)
is_superuser = models.BooleanField(verbose_name="Superuser",default=False)
date_joined = models.DateTimeField(verbose_name='date joined',auto_Now_add=True)
last_login = models.DateTimeField(verbose_name='last login',auto_Now=True)
image = models.ImageField(default='default.png',upload_to='profile_pics')
book = models.ManyToManyField('Book',through='GroupMember')
USERNAME_FIELD = 'email'
required_FIELDS = ['username']
objects = MyAccountManager()
def __str__(self):
return self.first_name + ' ' + self.last_name
def has_perm(self,perm,obj=None):
return self.is_admin
def has_module_perms(self,app_label):
return True
class Book(models.Model):
title = models.CharField(verbose_name="Title",blank=True)
year = models.CharField(verbose_name="Year",max_length=4,blank=True)
link = models.ManyToManyField(Account,related_name='users_account',through='GroupMember',verbose_name="Link")
def __str__(self):
return self.title + ' ' + self.year
class GroupMember(models.Model):
author = models.ForeignKey(Account,on_delete=models.CASCADE)
book = models.ForeignKey('Book',on_delete=models.CASCADE)
in_print = models.BooleanField(default=True)
最直接的问题是,如果我尝试将过滤后的书籍添加到 views.py 中的 b_form 中,如下所示:“b_form = BookUpdateForm(filtered_books)”,它会产生以下结果:“ValueError: too many values to unpack”。我明白错误发生的原因,我错误地使用了代码。但我不知道如何从这里开始填充那些 Crispy 文本框。感谢您的帮助。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)