需要一些关于将 ManyToManyField 与 Crispy 表单一起使用的建议

问题描述

我有一个简单的应用程序,我根据网上的大量信息构建了该应用程序,该应用程序围绕“书籍和作者”范式使用了 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...