Reputation: 9
I want to add posts in adding system from user profile page (without creating another page to adding). To profile page including html file for creating post
I created model, form, view and html but have no idea why it isn`t working.
The form doesn`t appear in page (except bottom "publish")
include is working
forms
from django import forms
from .models import Post, Comment
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['text', 'photo', 'video']
views
from django.shortcuts import redirect, render
from .models import Post, Comment
from .forms import PostForm, CommentForm
# Create your views here.
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_GET, require_POST
@login_required(login_url='users:login')
def create_post(request):
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
if form.is_valid():
post = form.save(commit=False)
post.user = request.user
post.save()
return redirect('user:profile')
else:
form = PostForm()
context = {'form': form}
return render(request, 'post/create_post.html', context)
create_post.html
<div class="posts-section">
<div class="new-post">
<form method='post' enctype="multipart/form-data">
{{form.as_p}}
{% csrf_token %}
<button>Publish</button>
</form>
</div>
</div>
user_profile.html
{% extends "base.html" %}
{% load profile_tags %}
{% block content %}
</div>
<div class="profile-info">
<p><strong>Email:</strong> {{ user.email }} </p>
<p><strong>About:</strong>{{ profile.about }}</p>
</div>
{% include "post/create_post.html" %}
</div>
{% endblock content %}
Upvotes: -1
Views: 39
Reputation: 73
Your form variable is outside scope for context. This is one of the possible solutions:
@login_required(login_url='users:login')
def create_post(request):
if request.method == 'POST':
# scope 1 - form
form = PostForm(request.POST, request.FILES)
if form.is_valid():
post = form.save(commit=False)
post.user = request.user
post.save()
return redirect('user:profile')
# if form is not valid - this context renders form from scope1
context = {'form': form}
return render(request, 'post/create_post.html', context)
# this will cach if request.method is not POST
# scope 2 - form
form = PostForm()
# scope 2 - context (same scope as form)
context = {'form': form}
return render(request, 'post/create_post.html', context)
Upvotes: 0