how to put several objects in one template - python

How do I pass the object from ClassDetail to CreateNewStudent in order to use it in its template ?
Thanks.
class ClassDetail(DetailView):
context_object_name = "Class"
template_name = "temp/students.html"
model = Class
class CreateNewStudent(CreateView):
model = Student
form_class = forms.StudentForm
template_name = "temp/newstudent.html"

As I see you have two models Class and Student. In this case better way to create custom view:
def myCustomView(request, pk):
get_class = get_object_or_404(Class, pk=pk)
student_form = StudentForm
if request.POST:
student_form = StudentForm(request.POST)
if student_form.is_valid():
...
return ...
else:
return render(request, 'index.html', {'get_class':get_class, 'student_form':sudent_form})
else:
return render(request, 'index.html', {'get_class':get_class, 'student_form':sudent_form})

Related

How to get userid in Django classviews?

I have this class that changes user password:
class PasswordsChangeView(PasswordChangeView):
from_class = PasswordChangingForm
success_url = reverse_lazy(
"base:password/passwordsuccess",
)
And I would like to insert User Avatar Img Path in context.
This Img is inside a UserComplement model.
When I create function views, it works doing:
#login_required
def password_success(request):
try:
obg = UserComplement.objects.get(pk=request.user.id)
context = {
"img_avatar": obg.avatar_image,
}
return render(request, "registration/passwordsuccess.html", context)
except UserComplement.DoesNotExist:
return render(request, "registration/passwordsuccess.html")
The problem is that I cannot get the userID in classviews to pass it through the context on success_url.
It was a lack of knowledge on how class based views work. The function get_context_data did the job well, returning the context.
class PasswordsChangeView(PasswordChangeView):
from_class = PasswordChangingForm
success_url = reverse_lazy(
"base:password/passwordsuccess",
)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
obj = UserComplement.objects.get(pk=self.request.user.id)
context["img_avatar"] = obj.avatar_image
return context

Can't get form class object in template view

I want to get the form object from self.Form
This is my form
class ActionLogSearchForm(forms.Form):
key_words = forms.CharField(required=False)
and I set form as form_class, however I can't fetch the form data in view
class ActionLogListView(LoginRequiredMixin, ListSearchView):
template_name = "message_logs/action_log.html"
form_class = ActionLogSearchForm
def get_queryset(self):
res = []
form = self.form ## somehow form is None
print(form.cleaned_data) # error occurs here. 'NoneType' object has no attribute 'cleaned_data'
I think this is the simplest set, but how can I make it work?
Try this:
from django.http import HttpResponseRedirect
from django.shortcuts import render
class ActionLogSearchForm(forms.Form):
key_words = forms.CharField(required=False)
class ActionLogListView(LoginRequiredMixin, ListSearchView, request):
form_class = ActionLogSearchForm
def get_queryset(self, request):
res = []
if request.method == 'POST':
form = self.form(request.POST)
if form.is_valid():
return HttpResponseRedirect('/thanks/')
else:
form = NameForm()
return render(request, 'message_logs/action_log.html', {'form': form})

How can I display form instance?

How can I pass the form with an actual filled profile informations (like ProfileUpdateForm(instance=x) in function views).
I did it this way and have no idea how to pass an actual profile instance to the form. Something like UpdateView, but in my DetailView class
class ProfileDetailView(FormMixin, DetailView):
model = Profile
context_object_name = 'profile'
template_name = 'profiles/myprofile.html'
form_class = ProfileUpdateForm
def post(self, request, *args, **kwargs):
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
form.save()
return super().form_valid(form)
def get_success_url(self):
return reverse_lazy('profiles:profile', kwargs={'pk': self.get_object().pk})
If you want to update an instance of a model you should use UpdateView [Django docs]:
from django.urls import reverse
from django.views.generic.edit import UpdateView
class ProfileDetailView(UpdateView):
model = Profile
context_object_name = 'profile'
template_name = 'profiles/myprofile.html'
form_class = ProfileUpdateForm
def get_success_url(self):
# Use `reverse` instead of `reverse_lazy`. You will get an error otherwise!
return reverse('profiles:profile', kwargs={'pk': self.get_object().pk})
Also if there is any need to pass a keyword argument to the form (here instance, although I would suggest to stick with UpdateView) you should override get_form_kwargs:
class MyView(SomeGenericView):
...
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['some_kwarg'] = 'Some value'
# Your use case implies below line
# kwargs['instance'] = self.get_object()
return kwargs

Django - selectively query models using pk_url_kwarg

Consider the these two models and view:
models.py
class BHA_List(models.Model):
well = models.ForeignKey(WellInfo, 'CASCADE', related_name='bha_list')
bha_number = models.CharField(max_length=100)
class BHA_overall(models.Model):
bha_number = models.ForeignKey(BHA_List, 'CASCADE', related_name='bha_overall')
drill_str_name = models.CharField(max_length=111)
depth_in = models.CharField(max_length=111)
views.py
class BHA_UpdateView(UpdateView):
model = BHA_overall
pk_url_kwarg = 'pk_alt'
form_class = BHA_overall_Form
To my understanding, pk_url_kwarg = 'pk_alt' will query and return instances of model = BHA_overall.
Let's say that I use a different CBV other than UpdateView, and want to implement two models. So something like this:
model = (BHA_overall, BHA_List). Is there any way that I force my pk_url_kwarg = 'pk_alt' to query and return instances only in BHA_List, but force my get_object() return objects in BHA_overall?? What CBV should I use?
you can use just 'View' and define methods post and get.
about like this:
class SomeView(View):
model = BHA_List
template_name = 'some.html'
def get(request, **kwargs):
overall = BHA_overall.objects.all()
return render(request,
self.template_name,
locals())
def get(request, **kwargs):
return render(request, self.template_name, {})

Pass context data from generic.DetailView

How can i pass the context data which is coming from a forms.py to my views class which is using generic detailView, i need to pass forms.py to my product detail page.
Here is the code for my view class
class ProductView(generic.DetailView):
model = Product
cart_product_form = CartAddProductForm()
context = {'cart_product_form': cart_product_form}
template_name = 'shopping/product.html'
query_pk_and_slug = True
Please let me know if this is incorrect
Override get_context_data, and add the form to the context before returning it.
class ProductView(generic.DetailView):
model = Product
template_name = 'shopping/product.html'
query_pk_and_slug = True
def get_context_data(self, **kwargs):
context = super(ProductView, self).get_context_data(**kwargs)
cart_product_form = CartAddProductForm()
context['cart_product_form'] = cart_product_form
return context

Categories