django如何正确建模这个表?

时间:2017-08-14 15:33:02

标签: django django-models django-views

根据我上一篇post的建议,我到目前为止:

发布模型:

class Post(models.Model):
    title = models.CharField(max_length=120)
    content = models.TextField()

小组模特:

class Group(models.Model):
    title = models.CharField(max_length=200)
    url = models.URLField(unique=True)
    contact_updated = models.DateField(auto_now=False, auto_now_add=True)
    group_status = models.CharField(max_length=20)
    admin = models.CharField(max_length=20)
    admin_status = models.CharField(max_length=20)
    frequency = models.IntegerField()  # allowed post frequency
    frq_scale = models.CharField(max_length=20, blank=True)
    obs = models.TextField(blank=True)

    posts = models.ManyToManyField(Post, through='control.Control')

控制模型:

class Control(models.Model):
    published = models.DateField(auto_now=False, auto_now_add=False)

    post = models.ForeignKey('posts.Post', on_delete=models.CASCADE)
    group = models.ForeignKey('groups.Group', on_delete=models.CASCADE)

这是对群组中帖子的控制。我可以在控制模型控制的许多组中发布1篇帖子。

CORRECTION : 邮件可以在许多组中发布。

如何使用这些模型生成表格(上面的链接)?或许我需要改变一些事情?

The table I want to produce

2 个答案:

答案 0 :(得分:0)

class Control(models.Model):
    published = models.DateField(auto_now=False, auto_now_add=False)

    post = models.ForeignKey('posts.Post', on_delete=models.CASCADE)
    group = models.ForeignKey('groups.Group', on_delete=models.CASCADE)

    class Meta:
        unique_together = (post, group )

答案 1 :(得分:0)

我最终在视图中创建了一个字典以传递给模板。 我没有改变模型。

这是观点:

def control_list(request):
group_status = STATUS_LIST
group_query_idx = 1
period_initial = date.today()-timedelta(days=30)
period_final = date.today()

if request.method == "POST":
    filter_form = FilterControl(request.POST)
    if filter_form.is_valid():
        group_query_idx = int(filter_form.cleaned_data['group_status'])
        period_initial = filter_form.cleaned_data['period_initial']
        period_final = filter_form.cleaned_data['period_final']

else:
    filter_form = FilterControl()

if group_query_idx:
    filtered_groups = Group.objects.filter_by_status(group_status[group_query_idx])

queryset_list = Control.objects.filter_by_group_status(group_status[group_query_idx])\
    .filter(published__range=[period_initial, period_final])

query = request.GET.get("q")
if query:
    queryset_list = queryset_list.filter(
        Q(post__content__icontains=query) |
        Q(post__title__icontains=query) |
        Q(group__title__icontains=query) |
        Q(group__admin__icontains=query) |
        Q(group__obs__icontains=query)
    ).distinct()  # avoid duplicated items

controls_per_group = {}
for group in filtered_groups:
    control = queryset_list.filter(group_id=group.id)
    controls_per_group[group.title] = control

context = {
    "object_list": queryset,
    "title": "Control",
    "controls_per_group": controls_per_group,
    "column": range(10),
    "group_status": group_status,
    "filter_form": filter_form,
}
return render(request, "control_list.html", context)

这是模板:

<table class="table table-hover table-striped">
<thead class="thead-inverse">
<tr>
    <th class="text-center">Action</th>
    <th class="text-center">Group</th>
    {% for value in column %}
    <th class="text-center">#</th>
    {% endfor %}
</tr>
</thead>

{% for key, value in controls_per_group.items %}
    <tr>
    <td class="text-center"><a class='btn btn-info btn-xs disabled' href="#"><i class="fa fa-pencil"></i></a>
        <a href="#" class="btn btn-danger btn-xs disabled"><i class="fa fa-trash-o"></i></a></td>
    <th class="text-center">{{ key }}</th>
    {% for control in value %}
        <th class="text-center"><a href="{{ control.post.get_absolute_url }}">{{ control.published | date:"d/m/y" }}<br>{{ control.post.id }}</a></th>
    {% endfor %}
    </tr>
{% endfor %}