Как я могу объединить эти два представления в одно? - PullRequest
0 голосов
/ 01 июня 2019

Я использую Django и у меня есть файл profile.html, который я пытаюсь, чтобы формы отображались вверху и внизу списка сообщений (разбитых на страницы), созданных конкретным пользователем. Есть ли способ объединить все функциональные возможности представления def profile (включая @login_required) с классом UserPostListView (ListView) в одном представлении? Как это будет построено?

#1st View
@login_required
def profile(request):
    if request.method == 'POST':
        #pass instance of user that expects to alter
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request, f'Your account has been updated!')
            return redirect('profile')
    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)

    context = {
        'u_form': u_form,
        'p_form': p_form,
        'posts': request.user.post_set.all()
    }

    return render(request, 'users/profile.html', context)

#2nd View
class UserPostListView(ListView):
    model = Post
    #<app>/<model>_<viewtype>.html
    template_name = 'users/profile.html'
    context_object_name = 'posts'
    paginate_by = 5

    def get_queryset(self):
        #kwargs gives us query parameters / if they exist we get the user otherwise 404
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        return Post.objects.filter(author=user).order_by('-date_posted')

В качестве стороны, это profile.html , который я сейчас пытаюсь реализовать:

{% extends "forum/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
        <div class="media">
            <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
            <div class="media-body">
                <h2 class="account-heading">{{ user.username }}</h2>
                <p class="text-secondary">{{ user.email }}</p>
            </div>
        </div>
        <form method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Profile Info</legend>
                {{ u_form|crispy }}
                {{ p_form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Update</button>
            </div>
        </form>
        {% for post in posts %}
            <article class="media content-section">
              <img class="rounded-circle article-img" src="{{ post.author.profile.image.url }}">
              <div class="media-body">
                <div class="article-metadata">
                  <a class="mr-2" href="{% url 'user-posts' post.author.username %}">{{ post.author }}</a>
                  <small class="text-muted">{{ post.date_posted|date:"F d, Y" }}</small>
                </div>
                <!-- takes in post.id from the pk of the post in posts and sends this to post-detail-->
                <h2><a class="article-title" href="{% url 'post-detail' post.id %}">{{ post.question }}</a></h2>
                <p class="article-content">{{ post.answer|urlize }}</p>
              </div>
            </article>
        {% endfor %}
        {% if is_paginated %}
            {% if page_obj.has_previous %}
                <a class="btn btn-outline-info mb-4" href="?page=1">First</a>
                <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous</a>
            {% endif %}

            {% for num in page_obj.paginator.page_range %}
                {% if page_obj.number == num %}
                    <a class="btn btn-info mb-4" href="?page={{ num }}">{{ num }}</a>
                {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
                    <a class="btn btn-outline-info mb-4" href="?page={{ num }}">{{ num }}</a>
                {% endif %}
            {% endfor %}

            {% if page_obj.has_next %}
                <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}">Next</a>
                <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.paginator.num_pages }}">Last</a>
            {% endif %}
        {% endif %}
    </div>
{% endblock content %}
...