Django模型窗体集如何创建现有和预填充的“新”项的混合

2024-06-07 07:31:47 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我正在构建一个阅读列表应用程序。每个阅读列表都有一个名称,以及许多链接回一本书的ReadingListBook对象。另外,假设有许多用户被授予访问此阅读列表的权限。每位用户在读完这本书后,都要给这本书打1-10分。请参见以下模型:

#models.py
class Book(models.Model):
    name = models.CharField(max_length=255)

class ReadingList(models.Model):
    name = models.CharField(max_length=255)

class ReadingListBook(models.Model):
    reading_list = models.ForeignKey('ReadingList')
    book = models.ForeignKey('Book')

class ReadingListBookUserRating(models.Model):
    reading_list_book = models.ForeignKey('ReadingListBook')
    user = models.ForeignKey(User)
    rating = models.IntegerField() #rating of 1-10

以及以下评级模型:

#forms.py
class RLBRatingForm(forms.ModelForm):
    class Meta:
        model=ReadingListBookUserRating
        fields = ['reading_list_book', 'rating']

在任何给定的时间,用户可能已经为给定阅读列表中的一些、所有或没有的书籍创建了分级。你知道吗

我的目标是生成一个由多个RLBRatingForms组成的表单集-在ReadingList中为每一本可能评级的书生成一个表单集。对于用户已评级的任何书籍,其现有评级将预先填充。对于他们没有评分的任何书籍,输入字段将为空。我知道如何为现有的评分创建一个表单集,但我不确定如何为尚未评分的书籍添加表单。你知道吗

例如-如果阅读列表中有3本书,“Book a”、“Book B”和“Book C”,并且用户只对Book a进行了评级,则我希望我的表单集如下所示:

Book A: <Users Rating>
Book B: <BLANK>
Book C: <BLANK>

注意:未评级的书籍必须没有数据库条目。思想?你知道吗


Tags: 用户表单列表modelmodelslistclass书籍
1条回答
网友
1楼 · 发布于 2024-06-07 07:31:47

如果我理解这个问题,我认为您可以通过使用Django模板的特性和编写自定义过滤器来解决这个问题。你知道吗

例如:

# yourapp/templatetags/filter.py
from django import template

register = template.Library()

@register.filter
def has_rated(user, book):
    # Logic to figure out if the book is rated or not
    if user_has_rated_book:
        return True
    return False

然后在模板中:

<!  yourapp/templates/yourtemplate.html  >

<!  loop through the books, provided to the template  >
{% for book in reading_list %}
    {% if user|has_rated: book %}
        <!  display rating  >
    {% else %}
        <!  display form field  >
    {% endif %}
{% endfor %}

下面是关于writing custom filters的更多信息。我希望我没有过于简单化!你知道吗

相关问题 更多 >