Day_08

项目列表

1.展示项目

  • 从数据库中获取星标、我创建的、我参与的数据
def project_list(request):
    '''项目列表'''
    if request.method == "GET":
        project_dict = {"star": [], "my": [], "join": []}
        # 我创建的所有的项目
        my_project_list = models.Project.objects.filter(creator=request.tracer.user)
        for row in my_project_list:
            if row.star:
                project_dict["star"].append(row)
            else:
                project_dict["my"].append(row)
        # 我参与的所有项目
        join_project_list = models.ProjectUser.objects.filter(user=request.tracer.user)
        for item in join_project_list:
            if item.star:
                project_dict["star"].append(item.project)
            else:
                project_dict["join"].append(item.project)

        form = ProjectModelForm(request)
        return render(request, "project_list.html", {"form": form,"project_dict":project_dict})
  • 在前端页面展示(修改部分代码)
<style>
        .project {
            margin-top: 10px;
        }

        .panel-info{
            margin-top: 10px;
        }

        .panel-body {
            padding: 0;
            display: flex;
            flex-direction: row;
            justify-content: left;
            align-items: flex-start;
            flex-wrap: wrap;
        }

        .panel-body > .item {
            border-radius: 6px;
            width: 228px;
            border: 1px solid #dddddd;
            margin: 20px 10px;

        }

        .panel-body > .item:hover {
            border: 1px solid #f0ad4e;
        }

        .panel-body > .item > .title {
            height: 104px;
            color: white;
            display: flex;
            justify-content: center;
            align-items: center;
            border-top-left-radius: 6px;
            border-top-right-radius: 6px;
            font-size: 15px;
            text-decoration: none;
        }

        .panel-body > .item > .info {
            padding: 10px 10px;

            display: flex;
            justify-content: space-between;

            border-bottom-left-radius: 6px;
            border-bottom-right-radius: 6px;
            color: #8c8c8c;

        }

        .panel-body > .item > .info a {
            text-decoration: none;
        }

        .panel-body > .item > .info .fa-star {
            font-size: 18px;
        }

        .color-radio label {
            margin-left: 0;
            padding-left: 0;
        }

        .color-radio input[type="radio"] {
            display: none;
        }

        .color-radio input[type="radio"] + .cycle {
            display: inline-block;
            height: 25px;
            width: 25px;
            border-radius: 50%;
            border: 2px solid #dddddd;
        }

        .color-radio input[type="radio"]:checked + .cycle {
            border: 2px solid black;
        }
    </style>
{% block content %}
    <div class="container-fluid project">
        <a class="btn btn-primary" data-toggle="modal" data-target="#addModal"><span
                class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span> 新建项目
        </a>

        <div class="panel panel-info">
            <div class="panel-heading"><i class="fa fa-star" aria-hidden="true"></i>星标项目</div>
            <div class="panel-body">
                {% for item in project_dict.star %}
                    <div class="item">
                        <a href="#" class="title"
                           style="background-color: {{ item.get_color_display }};">{{ item.name }}</a>
                        <div class="info">
                            <div>
                                <a href="#">
                                    <i class="fa fa-star" aria-hidden="true" style="color: #f0ad4e;"></i>
                                </a>
                                <span>{{ item.creator.username }}</span>
                            </div>
                            <div>
                                <i class="fa fa-user-o" aria-hidden="true"></i>
                                <span>{{ item.join_count }}</span>
                            </div>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>

        <div class="panel panel-success">
            <div class="panel-heading"><i class="fa fa-user-circle" aria-hidden="true"></i>我创建的</div>
            <div class="panel-body">
                {% for item in project_dict.my %}
                    <div class="item">
                        <a href="#" class="title"
                           style="background-color: {{ item.get_color_display }};">{{ item.name }}</a>
                        <div class="info">
                            <div>
                                <a href="#">
                                    <i class="fa fa-star" aria-hidden="true" style="color: #d5d5d5"></i>
                                </a>
                                <span>{{ item.creator.username }}</span>
                            </div>
                            <div>
                                <i class="fa fa-user-o" aria-hidden="true"></i>
                                <span>{{ item.join_count }}</span>
                            </div>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>

        <div class="panel panel-danger">
            <div class="panel-heading"><i class="fa fa-users" aria-hidden="true"></i>我参与的</div>
            <div class="panel-body">
                {% for item in project_dict.join %}
                    <div class="item">
                        <a href="#" class="title"
                           style="background-color: {{ item.get_color_display }};">{{ item.name }}</a>
                        <div class="info">
                            <div>
                                <a href="#">
                                    <i class="fa fa-star" aria-hidden="true" style="color: #d5d5d5"></i>
                                </a>
                                <span>{{ item.creator.username }}</span>
                            </div>
                            <div>
                                <i class="fa fa-user-o" aria-hidden="true"></i>
                                <span>{{ item.join_count }}</span>
                            </div>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>
    </div>

    <!-- Modal -->
    <div class="modal fade" id="addModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">&times;</span></button>
                    <h4 class="modal-title" id="myModalLabel">新建项目</h4>
                </div>
                <div class="modal-body">
                    <form id="addForm">
                        {% csrf_token %}
                        {% for field in form %}
                            <div class="form-group">
                                <label for="{{ field.id_for_label }}">{{ field.label }}</label>
                                {{ field }}
                                <span class="error-msg"></span>
                            </div>
                        {% endfor %}

                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">取 消</button>
                    <button type="button" class="btn btn-primary" id="btnSubmit">保 存</button>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

效果展示
image

2.星标项目

  • 2.1 添加星标
  • 我创建的项目:project.star = True
  • 我参与的项目:projectUser.star = True
  • 2.2 移除星标
  • 我创建的项目:project.star = False
  • 我参与的项目:projectUser.star = False
    image
视图函数
def project_star(request,project_type,project_id):
    """星标项目"""
    if project_type == "my":
        models.Project.objects.filter(id=project_id,creator=request.tracer.user).update(star=True)
        return redirect("project_list")
    if project_type == "join":
        models.ProjectUser.objects.filter(project_id=project_id,user=request.tracer.user).update(star=True)
        return redirect("project_list")
    return HttpResponse("请求错误!")

def project_unstar(request,project_type,project_id):
    """取消星标"""
    if project_type == "my":
        models.Project.objects.filter(id=project_id,creator=request.tracer.user).update(star=False)
        return redirect("project_list")
    if project_type == "join":
        models.ProjectUser.objects.filter(project_id=project_id,user=request.tracer.user).update(star=False)
        return redirect("project_list")
    return HttpResponse("请求错误!")
前端页面
{% block content %}
    <div class="container-fluid project">
        <a class="btn btn-primary" data-toggle="modal" data-target="#addModal"><span
                class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span> 新建项目
        </a>

        <div class="panel panel-info">
            <div class="panel-heading"><i class="fa fa-star" aria-hidden="true"></i>星标项目</div>
            <div class="panel-body">
                {% for item in project_dict.star %}
                    <div class="item">
                        <a href="#" class="title"
                           style="background-color: {{ item.value.get_color_display }};">{{ item.value.name }}</a>
                        <div class="info">
                            <div>
                                <a href="{% url 'project_unstar' project_type=item.type project_id=item.value.id %}">
                                    <i class="fa fa-star" aria-hidden="true" style="color: #f0ad4e;"></i>
                                </a>
                                <span>{{ item.value.creator.username }}</span>
                            </div>
                            <div>
                                <i class="fa fa-user-o" aria-hidden="true"></i>
                                <span>{{ item.value.join_count }}</span>
                            </div>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>

        <div class="panel panel-success">
            <div class="panel-heading"><i class="fa fa-user-circle" aria-hidden="true"></i>我创建的</div>
            <div class="panel-body">
                {% for item in project_dict.my %}
                    <div class="item">
                        <a href="#" class="title"
                           style="background-color: {{ item.get_color_display }};">{{ item.name }}</a>
                        <div class="info">
                            <div>
                                <a href="{% url 'project_star' project_type='my' project_id=item.id %}">
                                    <i class="fa fa-star" aria-hidden="true" style="color: #d5d5d5"></i>
                                </a>
                                <span>{{ item.creator.username }}</span>
                            </div>
                            <div>
                                <i class="fa fa-user-o" aria-hidden="true"></i>
                                <span>{{ item.join_count }}</span>
                            </div>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>

        <div class="panel panel-danger">
            <div class="panel-heading"><i class="fa fa-users" aria-hidden="true"></i>我参与的</div>
            <div class="panel-body">
                {% for item in project_dict.join %}
                    <div class="item">
                        <a href="#" class="title"
                           style="background-color: {{ item.get_color_display }};">{{ item.name }}</a>
                        <div class="info">
                            <div>
                                <a href="{% url 'project_star' project_type="join" project_id=item.id %}">
                                    <i class="fa fa-star" aria-hidden="true" style="color: #d5d5d5"></i>
                                </a>
                                <span>{{ item.creator.username }}</span>
                            </div>
                            <div>
                                <i class="fa fa-user-o" aria-hidden="true"></i>
                                <span>{{ item.join_count }}</span>
                            </div>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>
    </div>

    <!-- Modal -->
    <div class="modal fade" id="addModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">&times;</span></button>
                    <h4 class="modal-title" id="myModalLabel">新建项目</h4>
                </div>
                <div class="modal-body">
                    <form id="addForm">
                        {% csrf_token %}
                        {% for field in form %}
                            <div class="form-group">
                                <label for="{{ field.id_for_label }}">{{ field.label }}</label>
                                {{ field }}
                                <span class="error-msg"></span>
                            </div>
                        {% endfor %}

                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">取 消</button>
                    <button type="button" class="btn btn-primary" id="btnSubmit">保 存</button>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

3.添加项目:颜色选择

自定义颜色选择插件
ProjectModelForm中:from web.forms.widgets import ColorRadioSelect
将color原本的forms.RadioSelect修改为自定义ColorRaioSelect
image

widgets中:
image

创建两个Rdio.html和Radio_option.html自定义模板:

{% with id=widget.attrs.id %}
    <div{% if id %} id="{{ id }}"{% endif %}{% if widget.attrs.class %} class="{{ widget.attrs.class }}"{% endif %}>
        {% for group, options, index in widget.optgroups %}
            {% for option in options %}
                <label {% if option.attrs.id %} for="{{ option.attrs.id }}"{% endif %} >
                    {% include option.template_name with widget=option %}
                </label>
            {% endfor %}
        {% endfor %}
    </div>
{% endwith %}

{% include "django/forms/widgets/input.html" %}
<span class="cycle" style="background-color:{{ option.label }}"></span>
  • 效果
    image

**酷宝建议:有不懂的代码,一定要多看几遍,从最开始的导入到应用,梳理好逻辑关系,脑袋不发昏

posted @ 2023-05-08 20:33  Cool-Bo  阅读(23)  评论(0)    收藏  举报