Django:为什么我的提交兴趣表没有提交.我的观点或模板写错了吗


Django:为什么我的提交兴趣表没有提交。我的观点或模板写错了吗?根据我写的观点,我甚至在点击提交后都不会被重定向。当我返回主页时,我收到来自的消息

messages.warning(request, 'Something went wrong. Please try again..', extra_tags='wronginterest')

这就是为什么我认为这是因为表格无效,这就是为什么它没有提交。但是为什么它是无效的??感谢

views.py

def submit_interest_view(request, slug):
user = request.user
blog_post = BlogPost.objects.get(slug=slug)
num_blogpost = BlogPost.objects.filter(author=request.user).count()
if not user.is_authenticated:
return redirect('must_authenticate')
elif blog_post.author == request.user:
return HttpResponse('You cannot submit interest to your own post.')
interest_requests = Interest.objects.filter(interestsender=request.user, interestreceiver=blog_post.author)
for interest_request in interest_requests:
if interest_request.is_active:
return HttpResponse('You have already submitted your interest to this post.')
if request.method == 'POST':  # use request.method == 'POST' to submit POST request (like submitting a form)
form = SubmitInterestForm(request.POST, request.FILES)
if form.is_valid():
obj = form.save(commit=False)
author = Account.objects.get(email=user.email)  # use get if you aim to get a single object not a queryset
obj.author = author
obj.blog_post = blog_post
obj.save()
messages.success(request, 'Your interests have been submitted', extra_tags='submittedinterest')
context['success_message'] = "Updated"
if request.META.get('HTTP_REFERER') == request.build_absolute_uri(reverse("HomeFeed:main")):
return redirect(reverse("HomeFeed:main"))
elif request.META.get('HTTP_REFERER') == request.build_absolute_uri(reverse("HomeFeed:detail", kwargs={'slug': slug })):        
return redirect(reverse('HomeFeed:detail', kwargs={'slug': slug}))
else:   
return redirect(reverse('HomeFeed:main'))     
#return redirect(reverse('HomeFeed:detail', kwargs={'slug': slug})) # redirect to your post detail but use reverse to pass kwargs not just redirect
else:
messages.warning(request, 'Something went wrong. Please try again..', extra_tags='wronginterest')
else:
form = SubmitInterestForm()  #  if request.method isnt POST you still need to define your form so it can be displayed
return render(request, "HomeFeed/submitinterest.html", {'form': form,'user': user, 'num_blogpost': num_blogpost, 'blog_post': blog_post}) # context dict 


forms.py

HomeFeed: forms.py:
class SubmitInterestForm(forms.ModelForm):
class Meta:
model= Interest
fields = ['my_name', 'my_thoughts','short_file',]

型号.py

class Interest(models.Model):
interestsender = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='interestsender', on_delete=models.CASCADE)
interestreceiver = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='interestreceiver', on_delete=models.CASCADE)
timestamp        = models.DateTimeField(auto_now_add=True)
is_active            = models.BooleanField(blank=False, null=False, default=True)
my_name           = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
blog_post = models.ForeignKey(BlogPost, on_delete=models.CASCADE)
my_thoughts         = models.TextField(max_length=5000, null=False, blank=False)
short_file      = models.FileField(upload_to='documents/', null=True, blank=True)

def upload_location(instance, filename):
#you define this variable called file_path. It belongs to the HomeFeed app, and takes in the parameter of author id, title of blog post with the file name that the author uploads it, and you want to format it 
file_path = 'HomeFeed/{author_id}/{title}-{filename}'.format(
author_id=str(instance.author.id),title=str(instance.chief_title), filename=filename)
#the above will let you insert the strings, you want to take ID of the user who is uploading and converting it into a string, and also the title and file name, converting them into string
# return file path means where the images is stored, either the local machine/ production environment which will be the name file stored in the content delivery network
return file_path

class BlogPost(models.Model):
chief_title                    = models.CharField(max_length=50, null=False, blank=False)
body                   = models.TextField(max_length=5000, null=False, blank=False)
likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='blog_posts', blank=True)
author                     = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
slug                   = models.SlugField(blank=True, unique=True)
date_published             = models.DateTimeField(auto_now_add=True, verbose_name="date published")


class Account(AbstractBaseUser):
email                  = models.EmailField(verbose_name="email", max_length=60, unique=True)
username               = models.CharField(max_length=30, unique=True) 
date_joined                = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login             = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin               = models.BooleanField(default=False)
is_active              = models.BooleanField(default=True)
is_staff               = models.BooleanField(default=False)
is_superuser           = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']

html:

submit_interest.thml

<form method="post" enctype="multipart/form-data">{% csrf_token %}

<div class="form-group">
<input class="form-control bg-white form-control-plaintext c" rows="10" type="text" name="my_name" id="my_name" placeholder="Name: {{ request.user.username }}" readonly></input>
</div>

<div class="form-group">
<label for="my_thoughts text-dark">thoughts:</label>
<textarea  class="form-control" rows="6" type="text" name="my_thoughts" id="my_thoughts" placeholder="My thoughts..." required></textarea >
</div>

<label for="short_file " class="text-dark">Brief file (Optional):</label>
<input type="file"  class="btn btn-md btn-light" name="short_file" id="short_file"> <!--<button type="submit" class="btn btn-md btn-info">Upload</button>-->
{% if uploaded_file_url %}
<p>File uploaded at: <a href="{{ uploaded_file_url }}">{{ uploaded_file_url }}</a></p>
{% endif %}

<button class="submit-button btn btn-lg btn-primary mt-3 btn-block col-lg-6 offset-lg-3 " type="submit">Submit Interest</button>

</form>

urls.py

app_name = 'HomeFeed'
urlpatterns = [
path('', home_feed_view , name= "main"),
path('submitinterest/<slug>', submit_interest_view, name= "submitinterest"),

您需要找出为什么这没有得到验证。当表单无效时,请通过上下文将表单实例发送回模板,并尝试呈现错误。例如:

# view
if form.is_valid():
# ...
else:
messages.warning(request, 'Something went wrong. Please try again..', extra_tags='wronginterest')
return render(request, "HomeFeed/submitinterest.html", {'form': form,'user': user, 'num_blogpost': num_blogpost, 'blog_post': blog_post}) # context dict 

# template
{% for field in form %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
{% if field.help_text %}
<p class="help">{{ field.help_text|safe }}</p>
{% endif %}
</div>
{% endfor %}

有关表单错误呈现的更多详细信息,请参阅文档。


BTW对您的代码进行一些小的优化:

from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404
@login_required
def submit_interest_view(request, slug):
user = request.user
blog_post = get_object_or_404(BlogPost, slug=slug)
num_blogpost = BlogPost.objects.filter(author=user).count()
if blog_post.author.email == user.email:
return HttpResponse('You cannot submit interest to your own post.')
interest_requests = Interest.objects.filter(interestsender=user, interestreceiver=blog_post.author, is_active=True)

if interest_requests.exists():
return HttpResponse('You have already submitted your interest to this post.')
if request.method == 'POST':  # use request.method == 'POST' to submit POST request (like submitting a form)
form = SubmitInterestForm(request.POST, request.FILES)
if form.is_valid():
obj = form.save(commit=False)
author = Account.objects.get(email=user.email) # use 'author = user.account' if there is OneToOne relation between user and account
obj.author = author
obj.blog_post = blog_post
obj.save()
messages.success(request, 'Your interests have been submitted', extra_tags='submittedinterest')
context['success_message'] = "Updated"
if request.META.get('HTTP_REFERER') == request.build_absolute_uri(reverse("HomeFeed:main")):
return redirect(reverse("HomeFeed:main"))
elif request.META.get('HTTP_REFERER') == request.build_absolute_uri(reverse("HomeFeed:detail", kwargs={'slug': slug })):        
return redirect(reverse('HomeFeed:detail', kwargs={'slug': slug}))
else:   
return redirect(reverse('HomeFeed:main'))     
#return redirect(reverse('HomeFeed:detail', kwargs={'slug': slug})) # redirect to your post detail but use reverse to pass kwargs not just redirect
else:
messages.warning(request, 'Something went wrong. Please try again..', extra_tags='wronginterest')
return render(request, "HomeFeed/submitinterest.html", {'form': form,'user': user, 'num_blogpost': num_blogpost, 'blog_post': blog_post}) 
else:
form = SubmitInterestForm()  #  if request.method isnt POST you still need to define your form so it can be displayed
return render(request, "HomeFeed/submitinterest.html", {'form': form,'user': user, 'num_blogpost': num_blogpost, 'blog_post': blog_post}) # context dict 

最新更新