Related
I am getting the following error: Reverse for 'order_pdf' with arguments '('',)' not found. 1 pattern(s) tried: ['business_plan/(?P<id>[0-9]+)/pdf/$']
I am not sure exactly what is the reason for it.
Here is the model:
class Info(models.Model):
logo = models.ImageField(default='report-cover.jpg', null=True, blank=True)
date_posted = models.DateTimeField(default=timezone.now)
name = models.CharField(null=True, blank=True, max_length=100)
Here is the views.py
def add_business_plan(request):
# info=Info.objects.all()
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = infoForm(request.POST)
# check whether it's valid:
if form.is_valid():
form.save()
business_name = form.cleaned_data.get('businessName')
messages.success(request, f'PDF created for {business_name}!')
# return redirect('businessplan:businessplan')
# redirect(reverse('businessplan:businessplan', kwargs={'successful_submit': True}))
return render(request, 'businessplan/businessplan.html', {'successful_submit': True})
# if a GET (or any other method) we'll create a blank form
else:
form = infoForm()
print(form.errors)
return render(request, 'businessplan/businessplan.html', {'form': form, 'successful_submit': False,
# "Info": info
})
def order_pdf(request, info_id):
info = get_object_or_404(Info, id=info_id)
html = render_to_string('businessplan/pdf.html', {'info': info})
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="{}-Business Plan.pdf"'.format(info.businessName)
weasyprint.HTML(string=html, base_url=request.build_absolute_uri()).write_pdf(response,
stylesheets=[weasyprint.CSS(settings.STATICFILES_DIRS[0] + '\css\\report.css')], presentational_hints=True)
return response
def admin_order_pdf(request, info_id):
info = get_object_or_404(Info, id=info_id)
html = render_to_string('businessplan/pdf.html', {'info': info})
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'filename="{}-Business Plan.pdf"'.format(info.businessName)
weasyprint.HTML(string=html, base_url=request.build_absolute_uri()).write_pdf(response,
stylesheets=[weasyprint.CSS(settings.STATICFILES_DIRS[0] + '\css\\report.css')], presentational_hints=True)
return response
Here is the urls.py
urlpatterns = [
path('', add_business_plan, name='businessplan'),
path('businessplan/admin/info/<str:info_id>/pdf/', admin_order_pdf, name='admin_order_pdf'),
#path('<str:info_id>/pdf/', admin_order_pdf, name='admin_order_pdf'),
path('<str:info_id>/pdf/', order_pdf, name='order_pdf'),
]
Here is the businessplan.html snippet of the template:
....modal divs
<a href="{% url 'businessplan:order_pdf' Info.id %}">
<!--<a href="{% url 'businessplan:order_pdf' obj.id %}">-->
<!--<a href="{% url 'businessplan:order_pdf' Info.info_id %}">-->
....modal divs
<form class="needs-validation" method="post" novalidate enctype="multipart/form-data">
{% csrf_token %}
<div class="form-outline mb-4 mt-3">
<input required autocomplete="off" type="text" class="form-control" name=" name"
{% if form.is_bound %} value= "{{ form.name.value }}" {% endif %}>
<label class="form-label">Name</label>
</div>
{% for err in form.name.errors %}
<small class="text-danger ml-2">{{ err }}</small>
{% endfor %}
</div>
</form>
{% if successful_submit %}
<script type="text/javascript">
$(document).ready(function(){
$("#exampleModal").modal('show');
});
</script>
{% endif %}
I can access the pdf from the admin but I am trying to access to add this button for easier functionality.
I have tried changing the info_id to id it didn't work.
What is the reason for this error?
Here is the traceback:
Internal Server Error: /business_plan/
Traceback (most recent call last):
File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\User\Desktop\Portfolio\businessplan\views.py", line 30, in add_business_plan
return render(request, 'businessplan/businessplan.html', {'form': form, 'successful_submit': False })
File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\shortcuts.py", line 19, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\loader.py", line 62, in render_to_string
return template.render(context, request)
File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\backends\django.py", line 61, in render
return self.template.render(context)
File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\base.py", line 170, in render
return self._render(context)
File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\base.py", line 162, in _render
return self.nodelist.render(context)
File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\base.py", line 938, in render
bit = node.render_annotated(context)
File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\base.py", line 905, in render_annotated
return self.render(context)
File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\defaulttags.py", line 446, in render
url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\urls\base.py", line 87, in reverse
return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\urls\resolvers.py", line 685, in _reverse_with_prefix
raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'order_pdf' with arguments '('',)' not found. 1 pattern(s) tried: ['business_plan/(?P<info_id>[^/]+)/pdf/$']
[10/Oct/2021 06:58:51] "GET /business_plan/ HTTP/1.1" 500 143694
Looks like <a href="{% url 'businessplan:order_pdf' Info.id %}"> doesn't work because you don't pass it to the template context.
As a result, the call fails because Info.id is an empty string (cf https://docs.djangoproject.com/en/3.2/ref/templates/api/#invalid-template-variables), hence breaking the URL reversing logic.
You should pass your info instance to the template context to make this work, e.g like this:
return render(
request,
'businessplan/businessplan.html',
{
'form': form,
'successful_submit': False,
"Info": info_instance
}
)
ValueError: invalid literal for int() with base 10: 'slug-1-2'
2nd time i am facing this error again. I am trying to allow users to edit their comments in any blog post but it seems that there is a problem with this line:
comment = get_object_or_404(Comment, id=post_id)
This has worked for other functions (eg when i created a function that can delete comments) but not this one. Any idea how I can resolve this? I got a feeling its sth to do with when I add comments in the url I use slug and <post_id> when I edit comments url. But it worked for my delete function and i did use post_id for that function. Thanks
models.py
class Comment(models.Model):
post = models.ForeignKey(BlogPost, related_name='comments', on_delete=models.CASCADE)
name = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='name', on_delete=models.CASCADE)
body = models.TextField()
class BlogPost(models.Model):
title = models.CharField(max_length=50, null=False, blank=False, unique=True)
body = models.TextField(max_length=5000, null=False, blank=False)
slug = models.SlugField(blank=True, unique=True)
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
views.py
def edit_own_comment(request, post_id):
context = {}
comment = get_object_or_404(Comment, id=post_id)
if request.method == 'POST':
form = UpdateCommentForm(request.POST, instance=comment)
if comment.name == request.user and form.is_valid():
obj = form.save(commit=False)
obj.save()
messages.success(request, 'Your comment has been edited', extra_tags='editedcomment')
return redirect(reverse("HomeFeed:detail", kwargs={'slug': comment.post.slug }))
form = UpdateCommentForm(
initial = {
"body": comment.body,
}
)
context['form'] = form
return render(request, 'HomeFeed/edit_comment.html', context)
class AddCommentView(LoginRequiredMixin, DetailView, FormView):
login_url = 'must_authenticate'
model = BlogPost
form_class = CommentForm
template_name = 'HomeFeed/add_comment.html'
def form_valid(self, form):
comment = form.save(commit=False)
comment.name = self.request.user
comment.post = self.get_object()
comment.save()
return redirect(reverse("HomeFeed:detail", kwargs={'slug': comment.post.slug }))
def delete_any_comment(request, post_id):
if request.method == 'POST':
comment = get_object_or_404(Comment, id=post_id)
if comment.post.author == request.user:
comment.delete()
return redirect(reverse("HomeFeed:detail", kwargs={'slug': comment.post.slug }))
forms.py
class UpdateCommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['body']
def save(self, commit=True):
comment = self.instance
comment.body = self.cleaned_data['body']
if commit:
comment.save()
return comment
urls.py
path('comments/<slug>', AddCommentView.as_view(), name= "add_comment"),
path('editowncomments/<post_id>', edit_own_comment, name= "edit_own_comment"),
path('deleteanycomments/<post_id>', delete_any_comment, name= "deleteanycomments"),
html
<form class="create-form" method="POST" enctype="multipart/form-data">{% csrf_token %}
<div class="form-group">
<label for="id_body">Body</label>
<textarea class="form-control" rows="8" type="text" name="body" id="id_body" required>{{form.initial.body}}</textarea>
</div>
<button class="submit-button btn btn-lg btn-primary btn-block" type="submit">Edit Comment</button>
</form>
TraceBack
Internal Server Error: /HomeFeed/editowncomments/slug
Traceback (most recent call last):
File "lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "HomeFeed/views.py", line 995, in edit_own_comment
comment = get_object_or_404(Comment, id=post_id)
File "lib/python3.8/site-packages/django/shortcuts.py", line 93, in get_object_or_404
return queryset.get(*args, **kwargs)
File "/lib/python3.8/site-packages/django/db/models/query.py", line 399, in get
clone = self.filter(*args, **kwargs)
File "/lib/python3.8/site-packages/django/db/models/query.py", line 892, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "lib/python3.8/site-packages/django/db/models/query.py", line 910, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1290, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1315, in _add_q
child_clause, needed_inner = self.build_filter(
File "/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1251, in build_filter
condition = self.build_lookup(lookups, col, value)
File "/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1116, in build_lookup
lookup = lookup_class(lhs, rhs)
File "/lib/python3.8/site-packages/django/db/models/lookups.py", line 20, in __init__
self.rhs = self.get_prep_lookup()
File "lib/python3.8/site-packages/django/db/models/lookups.py", line 70, in get_prep_lookup
return self.lhs.output_field.get_prep_value(self.rhs)
File "/lib/python3.8/site-packages/django/db/models/fields/__init__.py", line 972, in get_prep_value
return int(value)
ValueError: invalid literal for int() with base 10: 'slug'
SLDEM's suggestion:
#login_required(login_url=reverse_lazy("must_authenticate"))
def edit_own_comment(request, post_id):
context = {}
comment = get_object_or_404(Comment, id='slug')
if comment.name != request.user:
return HttpResponse('You did not write the comment.')
if request.method == 'POST':
form = UpdateCommentForm(request.POST or None, instance=comment)
if comment.name == request.user and form.is_valid():
obj = form.save(commit=False)
#this prints a success message after it is safe
obj.save()
return redirect(reverse("HomeFeed:detail", kwargs={'slug': comment.post.slug }))
form = UpdateCommentForm(
initial = {
"body": comment.body,
}
)
context['form'] = form
return render(request, 'HomeFeed/edit_comment.html', context)
path('editowncomments/<int:post_id>', edit_own_comment, name= "edit_own_comment"),
html
{% if not blog_post.comments.all %}
<p>No comments yet... Add a comment</p>
{% else %}
Add a comment
<br>
{% for comment in blog_post.comments.all %}
<strong>
{{ comment.name}}
{{ comment.date_added }}
</strong>
{{ comment.body }}
{% if comment.name == request.user and blog_post.author != request.user %}
<form action = "{% url 'HomeFeed:deletecomments' comment.id %}" method = "POST"> {% csrf_token %}
<button class="btn btn-sm btn-danger">Delete</button>
</form>
{% endif %}
{% if blog_post.author == request.user %}
<form action = "{% url 'HomeFeed:deleteanycomments' comment.id %}" method = "POST"> {% csrf_token %}
<button class="btn btn-sm btn-danger">Delete</button>
</form>
{% endif %}
{% if comment.name == request.user %}
<a class="btn btn-sm btn-warning col-lg-4" href="{% url 'HomeFeed:edit_own_comment' comment_id %}">Edit comment</a>
{% endif %}
{% endfor %}
{% endif %}
detail views.py
class DetailBlogPostView(BlogPostMixin,DetailView):
template_name = 'HomeFeed/detail_blog.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
blog_post=self.get_object()
blog_post.save()
context['blog_post'] = blog_post
account = Account.objects.all()
context['account'] = account
#aka if blog post does belong to me
if blog_post.author != self.request.user:
if self.request.user.is_authenticated and \
blog_post.interest_set.filter(user__id=self.request.user.id).exists():
submittedinterest = True
context["interest_pk"]=blog_post.interest_set.first().pk
#if blog post belongs to me
else:
submittedinterest = False
context['submittedinterest'] = submittedinterest
if blog_post.interest_set.exists():
context["interest_pk"]=blog_post.interest_set.first().pk
return context
Well looks like the issue here is with your url, make it like this:
path('edit-own-comments/<int:post_id>', edit_own_comment, name="edit_own_comment"),
(Add the specification that the passed variable is actually an integer) And then use the value of your Comment instance id in your view.
Ok so based on your edits:
Where you have your html to edit the comment:
{% if comment.name == request.user %}
<a class="btn btn-sm btn-warning col-lg-4" href="{% url 'HomeFeed:edit_own_comment' comment.id %}">Edit comment</a> <!-- here change comment_id to comment.id to pass the correct value to the url -->
{% endif %}
In your view where you are getting the comment:
comment = get_object_or_404(Comment, id=post_id) # also rename post_id to something like comment_id here and in the url to make it more readable
And it should work.
Reverse for 'job_category' with keyword arguments '{'id': <Category: Government>}' not found. 1 pattern(s) tried: ['job_category/(?P<category_slug>[^/]+)/$']
{% extends 'base1.html' %}
{% block content %}
<div class="left col-sm-4" style="float:left; width: 360px;">
<h6 class="p-2" style="background:#A9CCE3; color:#2F4F4F;">JOB CATEGORIES</h6>
<ul class="list-group">
{% for x in categories %}
<li class="list-group-item c1 list-group-item-action" style="color: rgb(2,96,170);">
<div class="p-2">
<h7 class="card-title">
{{x.name}}
</h7>
</div>
<div class="overlay1"></div>
</li>
{% endfor %}
</ul>
</div>
<div class="right col-sm-8" style="float: right; width:825px;">
<!--{% if category %}{{category.name}}{% endif %} !-->
<div class="row container-fluid">
{% for job in jobs %}
<div class="col-sm-3 mt-3">
<div class="card c1">
<div class="overlay1"></div>
<div class="card-body">
<h5 class="card-title" style="color: rgb(2,96,170);">
{{job.post}}</h5>
<h6 class="card-text" style="color: rgb(85, 85, 85);">
{{job.job_id.comp_name}}</h6>
<p><i class="fas fa-map-marker-alt mr-1"></i>{{job.address}}<i
class="far fa-calendar-alt ml-3 mr-1"></i>{{job.todate|date:'d M, Y'}}</p>
<a href="{% url 'job_detail' job.job_id.id %}" class="btn btn-primary btn-sm right"
style="position:relative; float:right;">View more</a>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock content %}
views.py:
def job_category(request, category_slug=None):
category = None
job_requirements = []
categories = Category.objects.all()
jobs = Job.objects.all()
if category_slug:
category = Category.objects.get(slug=category_slug)
print(category.slug)
jobs = Job.objects.filter(job_category=category.slug)
for job in jobs:
job_requirements.append(JobRequirements.objects.get(job_id=job))
return render(request, 'JobCategory/category.html', {'categories': categories,
'jobs': job_requirements})
urls.py:
path('job_category/<str:category_slug>/', views.job_category, name='job_category'),
Models.py:
class Category(models.Model):
name = models.CharField(max_length=40, blank=True, null=True)
slug = models.CharField(max_length=4, unique=True)
def __str__(self):
return self.name
def get_absolute_path(self):
return reverse('job_category', kwargs={'category_slug': self.slug})
I've been trying to filter my page category wise. I cannot find where my mistake is at and can't simply decode this error message. I'm very new to this. Please help!
(Update) Traceback:
Internal Server Error: /job_category/IT/
Traceback (most recent call last):
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\DELL\PycharmProjects\RECRUIT\Home\views.py", line 33, in job_category
'jobs': job_requirements})
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\shortcuts.py", line 19, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\loader.py", line 62, in render_to_string
return template.render(context, request)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\backends\django.py", line 61, in render
return self.template.render(context)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\base.py", line 171, in render
return self._render(context)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\base.py", line 163, in _render
return self.nodelist.render(context)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\base.py", line 936, in render
bit = node.render_annotated(context)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\base.py", line 903, in render_annotated
return self.render(context)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\loader_tags.py", line 150, in render
return compiled_parent._render(context)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\base.py", line 163, in _render
return self.nodelist.render(context)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\base.py", line 936, in render
bit = node.render_annotated(context)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\base.py", line 903, in render_annotated
return self.render(context)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\loader_tags.py", line 62, in render
result = block.nodelist.render(context)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\base.py", line 936, in render
bit = node.render_annotated(context)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\base.py", line 903, in render_annotated
return self.render(context)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\template\defaulttags.py", line 443, in render
url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\urls\base.py", line 87, in reverse
return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
File "C:\Users\DELL\Anaconda3\lib\site-packages\django\urls\resolvers.py", line 677, in _reverse_with_prefix
raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'job_category' with keyword arguments '{'id': <Category: Government>}' not found. 1 pattern(s) tried: ['
job_category/(?P<category_slug>[^/]+)/$']
[14/Dec/2020 11:08:58] "GET /job_category/IT/ HTTP/1.1" 500 173336
I solved this problem by replacing my kwargs 'category_slug' with 'id'. But, I have no clue why it didn't take category_slug as an kwargs.
class Category(models.Model):
name = models.CharField(max_length=40, blank=True, null=True)
slug = models.CharField(max_length=4, unique=True)
def __str__(self):
return self.name
def get_absolute_path(self):
return reverse('job_category', kwargs={'id': self.slug})
urls.py
path('job_category/<str:id>/', views.job_category, name='job_category')
views.py
def job_category(request, id=None):
category = None
job_requirements = []
categories = Category.objects.all()
jobs = Job.objects.all()
if id:
category = Category.objects.get(slug=id)
print(category.slug)
jobs = Job.objects.filter(job_category=category.slug)
for job in jobs:
job_requirements.append(JobRequirements.objects.get(job_id=job))
print(job_requirements)
return render(request, 'JobCategory/category.html', {'categories': categories,
'jobs': job_requirements})
Im trying to combine an add and edit form into one and am receiving an error The 'site_image' attribute has no file associated with it.
I could edit files but could not add files, but now when I load the site files page I am receiving the below error, I havent changed the model so am unsure as to why im receiving this error.
the list of files shouldn't really care if site_image is there or not as its set to blank and null?
my file model:
class SiteFiles(models.Model):
site_data = models.ForeignKey(SiteData, verbose_name="Site", on_delete=models.PROTECT)
site_image = models.ImageField(upload_to='site_files/', blank=True, null=True)
site_image_thumbnail = ImageSpecField(source='site_image',
processors=[ResizeToFill(200, 150)],
format='JPEG',
options={'quality': 60})
site_file = models.FileField(blank=True, upload_to=site_files_path, \
validators=[validate_file_extension])
file_name = models.CharField(max_length=200, verbose_name="File Name")
file_type = models.CharField(max_length=100, verbose_name='File Type', \
choices=settings.FILE_TYPE)
class Meta:
verbose_name = "Site Files"
verbose_name_plural = "Site Files"
def __str__(self):
return '%s | %s | %s ' % (self.site_data.location, self.site_data.location, self.file_name)
my forms.py
class FileForm(forms.ModelForm):
class Meta:
model = SiteFiles
fields = ['site_image', 'site_file', 'file_name','file_type']
def __init__(self, *args, **kwargs):
super(FileForm, self).__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.form_id = 'file_form'
self.helper.form_method = 'POST'
self.helper.add_input(Submit('submit', 'Save', css_class='btn-primary'))
self.helper.layout = Layout(
Div(
Div(
Div(
Div(HTML('<i class="fa fa-camera-retro fa-fw"></i> Add File or Photo'), css_class='panel-heading'),
Div(
Field('site_image', placeholder='Image'),
Field('site_file', placeholder='File'),
Field('file_name', placeholder='Display Name'),
Div('file_type', title="File Type"),
css_class='panel-body'
),
css_class='panel panel-default',
),
css_class='col-lg-3'
),
css_class='row'
),
)
my views.py
#login_required
#user_passes_test(lambda u: u.has_perm('sites.add_sitefile'))
def add_edit_file(request, site_id, item_id=None):
from sites.forms import FileForm
from sites.models import SiteFiles
site_data = get_object_or_404(SiteData, pk=site_id)
# set edit values
if item_id:
item_data = get_object_or_404(SiteFiles, pk=item_id)
form_type = 'Edit'
form = FileForm(instance=item_data)
else:
# set add values
form = FileForm()
form_type = 'Add'
item_data = SiteFiles()
# set posting
if request.method == 'POST':
form = FileForm(request.POST,instance=item_data)
if form.is_valid():
form.instance.site_data = site_data
form.save()
return redirect('sites:site_detail_files', site_id)
return render(request, 'sites/add_edit_file.html', {
'add_edit_file_form': form,
'SiteName' : site_data.location,
'SiteID' : site_id,
'ItemID' : item_id,
'FormType' : form_type
})
Error:
Traceback:
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in _resolve_lookup
882. current = current[bit]
During handling of the above exception ('ImageFieldFile' object is not subscriptable), another exception occurred:
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _legacy_get_response
249. response = self._get_response(request)
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.6/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "/itapp/itapp/sites/views.py" in site_detail_files
311. 'active_files' : 'class="active"',
File "/usr/local/lib/python3.6/site-packages/django/shortcuts.py" in render
30. content = loader.render_to_string(template_name, context, request, using=using)
File "/usr/local/lib/python3.6/site-packages/django/template/loader.py" in render_to_string
68. return template.render(context, request)
File "/usr/local/lib/python3.6/site-packages/django/template/backends/django.py" in render
66. return self.template.render(context)
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in render
207. return self._render(context)
File "/usr/local/lib/python3.6/site-packages/django/test/utils.py" in instrumented_test_render
107. return self.nodelist.render(context)
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/local/lib/python3.6/site-packages/django/template/loader_tags.py" in render
177. return compiled_parent._render(context)
File "/usr/local/lib/python3.6/site-packages/django/test/utils.py" in instrumented_test_render
107. return self.nodelist.render(context)
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/local/lib/python3.6/site-packages/django/template/loader_tags.py" in render
177. return compiled_parent._render(context)
File "/usr/local/lib/python3.6/site-packages/django/test/utils.py" in instrumented_test_render
107. return self.nodelist.render(context)
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/local/lib/python3.6/site-packages/django/template/loader_tags.py" in render
72. result = block.nodelist.render(context)
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/local/lib/python3.6/site-packages/django/template/defaulttags.py" in render
216. nodelist.append(node.render_annotated(context))
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/local/lib/python3.6/site-packages/django/template/library.py" in render
202. resolved_args, resolved_kwargs = self.get_resolved_arguments(context)
File "/usr/local/lib/python3.6/site-packages/django/template/library.py" in get_resolved_arguments
188. resolved_args = [var.resolve(context) for var in self.args]
File "/usr/local/lib/python3.6/site-packages/django/template/library.py" in <listcomp>
188. resolved_args = [var.resolve(context) for var in self.args]
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in resolve
708. obj = self.var.resolve(context)
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in resolve
849. value = self._resolve_lookup(context)
File "/usr/local/lib/python3.6/site-packages/django/template/base.py" in _resolve_lookup
890. current = getattr(current, bit)
File "/usr/local/lib/python3.6/site-packages/django/db/models/fields/files.py" in url
69. self._require_file()
File "/usr/local/lib/python3.6/site-packages/django/db/models/fields/files.py" in _require_file
46. raise ValueError("The '%s' attribute has no file associated with it." % self.field.name)
Exception Type: ValueError at /sites/site/files/7
Exception Value: The 'site_image' attribute has no file associated with it.
EDIT:
site_details_files:
#login_required
def site_detail_files(request, site_id):
files = SiteFiles.objects.filter(site_data__id=site_id)
try:
site = files[0].site_data
except:
site = get_object_or_404(SiteData, pk=site_id)
return render(request, 'sites/site_detail_files.html', {
'Files': files,
'SiteName' : site.location,
'SiteID' : site.id,
'PageType' : 'files',
'active_files' : 'class="active"',
})
template:
{% block content %}
<div class="col-lg-9">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-camera fa-fw"></i> Photos
</div>
<div class="panel-body">
{% get_file_type Files 'Cabinet Photo' as photos %}
{% for file in photos %}
<div class="img-item">
<div class="img">
<a class="image-float-left" id="" href="{% signed_url file.site_image.url %}" target="_blank">
<img src="{% signed_url file.site_image_thumbnail.url %}" alt="" />
</a>
</div>
<div class="img-text">
{{ file.file_name }}
<div class="img-edit" >
<a href="{% url 'sites:edit_file' SiteID file.id %}" class="edit-icon">
<i class="fa fa-edit"></i>
</a>
</div>
</div>
</div>
<!-- /.img-item-->
{% endfor %}
</div>
<!-- /.panel-body-->
</div>
<!-- /.panel-->
</div>
<!-- /.col-lg-9 -->
<div class="col-lg-3">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-file-text-o fa-fw"></i> Files
</div>
<div class="panel-body">
{% exclude_file_type Files 'Cabinet Photo' as site_files %}
{% for file in site_files %}
<ul>
{% if file.file_type != "Cabinet Photo" %}
{% if file.site_file %}
<li>
<a href="{% url 'sites:edit_file' SiteID file.id %}" class="edit-icon">
<i class="fa fa-edit fa-1x"></i>
</a>
{{ file.file_name }}
</li>
{% endif %}
{% if file.site_image %}
<li>
<a href="{{% url 'sites:edit_file' SiteID file.id %}" class="edit-icon">
<i class="fa fa-edit"></i>
</a>
{{ file.file_name }}
</li>
{% endif %}
{% endif %}
</ul>
{% endfor %}
</div>
<!-- /.panel-body-->
</div>
<!-- /.panel-->
</div>
<!-- /.col-lg-9 -->
{% endblock %}
You need to pass request.FILES to the form when uploading files.
form = FileForm(request.POST, request.FILES, instance=item_data)
Make sure that you set enctype="multipart/form-data" in the template as well.
See the docs on file uploads for more info.
However, these changes won't solve your error, since it is coming from a different view site_detail_files. It looks as if you are using file.site_image.url in the template without checking file.site_image first. You should add an extra if block:
{% for file in photos %}
...
{% if file.site_image %}
...
<a class="image-float-left" id="" href="{% signed_url file.site_image.url %}" target="_blank">
...
{% endif %}
{% endfor %}
I want to learn python and web-dev and I am trying to make a functional web application. Right now I have problem with django-autocomplete-light.
I am trying to use autocomplete for my django application. I followed the tutorial, but when I try to search It says that The results could not be loaded.
But results are shown in dropdown list.
I have a form where user can add new invoce, I am trying to use django-autocomplete-light for autocompleting all suppliers so user, doesn't need to search for it.
My models:
class Supplier(models.Model):
supp_name = models.CharField(max_length=255)
mat_number = models.CharField(max_length=255)
organ = models.CharField(max_length=255, null=True, blank=True)
street = models.CharField(max_length=255, null=True, blank=True)
email = models.CharField(max_length=255, null=True, blank=True)
def __str__(self):
return self.supp_name.encode("utf-8")
def get_absolute_url(self):
return reverse('supplier-detail', args=[str(self.id)])
def __unicode__(self):
return '%s' % (self.supp_name,)
class Invoice(models.Model):
organization = models.ForeignKey(Group, help_text="organization")
input_peo = models.CharField(max_length=150)
date = models.DateTimeField(auto_now_add=True)
supplier = models.ForeignKey(Supplier, on_delete=models.SET_NULL, null=True, related_name='name')
invoice_number = models.CharField(max_length=100, null=True, blank=True, help_text='Številka preračuna')
price = models.FloatField(null=True, blank=True, help_text='Cena brez DDV')
sum_me = models.IntegerField(null=True, blank=True, help_text='Kolicina')
def __str__(self):
return self.organization.name.encode("utf-8")
def get_absolute_url(self):
return reverse('invoice-detail', args=[str(self.id)])
My views:
class AddInvoice(LoginRequiredMixin, generic.View):
login_url = '/accounts/login/'
redirect_field_name = 'redirect_to'
form_class = InvoiceCreate
template_name = 'invoce/invoce_form.html'
def get(self, request):
form = self.form_class(None)
return render(request, self.template_name, {'form': form})
def post(self, request):
form = self.form_class(request.POST)
if form.is_valid():
invoice = form.save(commit=False)
invoice.organization = request.user.groups.first()
invoice.input_peo = self.request.user.get_full_name()
invoice.supplier = form.cleaned_data['supplier']
invoice.invoice_number = form.cleaned_data['invoice_number']
invoice.price = form.cleaned_data['price']
invoice.sum_me = form.cleaned_data['sum_me']
invoice.save()
return HttpResponseRedirect('/')
return render(request, self.template_name, {'form': form})
'''
*
AUTOCOMPLETE
*
'''
class SupplierAutoComplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
qs = Supplier.objects.all()
if self.q:
qs = qs.filter(name__istartswith=self.q)
return qs
urls:
urlpatterns += [
url(
r'^autocomplete/$',
views.SupplierAutoComplete.as_view(model=Supplier),
name='supplier-autocomplete',
),
]
If I search just for autocomplete (/autocomplete/) in browser this is what i get:
my forms.py:
class InvoiceCreate(forms.ModelForm):
class Meta:
model = Invoice
fields = [
'supplier',
'invoice_number',
'price',
'sum_me',
]
widgets = {
'supplier': autocomplete.ModelSelect2(url='supplier-autocomplete')
}
and finally my template for form:
{% extends "base_generic.html" %}
{% block content %}
<div class="jumbotron">
<div class="row" style="margin-top:60px">
<form action="" method="post">
{% csrf_token %}
<!-- Left Inputs -->
<div class="col-xs-6 wow animated slideInLeft" data-wow-delay=".5s">
<!-- Supplier -->
{{ form.non_field_errors }}
<div class="fieldWrapper">
{{ form.supplier.errors }}
<label>Supplier:</label>
<div class="container">
{{ form.supplier }}
</div>
</div>
<!-- invoice_number -->
{{ form.non_field_errors }}
<div class="fieldWrapper">
{{ form.invoice_number.errors }}
<input type="text" name="invoice_number" id="id_invoice_number" placeholder="Invoice Number" class="form"/>
</div>
<!-- price -->
{{ form.non_field_errors }}
<div class="fieldWrapper">
{{ form.price.errors }}
<input type="text" name="price" id="id_price" placeholder="Price" class="form"/>
</div>
<!-- sum_me -->
{{ form.non_field_errors }}
<div class="fieldWrapper">
{{ form.sum_me.errors }}
<input type="number" name="sum_me" id="id_sum_me" placeholder="Sum" class="form"/>
</div>
</div><!-- End Left Inputs -->
<!-- Bottom Submit -->
<div class="relative fullwidth col-xs-12">
<!-- Send Button -->
<button type="submit" class="form-btn semibold">Add</button>
</div><!-- End Bottom Submit -->
<!-- Clear -->
<div class="clear"></div>
</form>
</div>
</div>
{{ form.media }}
{% endblock %}
This is traceback I get when I try to search:
[19/Aug/2017 14:29:54] "GET /invoice/autocomplete/?q=frnej HTTP/1.1" 500 16154
[2017-08-19 14:29:54,630] - Broken pipe from ('127.0.0.1', 55490)
Internal Server Error: /invoice/autocomplete/
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/dal/views.py", line 48, in dispatch
return super(ViewMixin, self).dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/views/generic/base.py", line 88, in dispatch
return handler(request, *args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/views/generic/list.py", line 160, in get
self.object_list = self.get_queryset()
File "/Users/miha/Desktop/#application/django/einvoice/invoice/views.py", line 255, in get_queryset
qs = qs.filter(name__istartswith=self.q)
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 784, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 802, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/usr/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1261, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "/usr/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1287, in _add_q
allow_joins=allow_joins, split_subq=split_subq,
File "/usr/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1212, in build_filter
raise FieldError('Related Field got invalid lookup: {}'.format(lookups[0]))
FieldError: Related Field got invalid lookup: istartswith