update objects before access using DetailView (Django) - python

I am using DetailView in Django. I have a model including certain time field(taxi_time), and I would like compare the time and now. If taxi_time < datetime.now(), I want to change a field(taxi_is_closed) in the model from False to True.
So before users access the post, I need to (automatically) check the time and modify taxi_is_closed. How can I do it?
My View.py :
#method_decorator(login_required(login_url='/login/'), name='dispatch')
class RecruitView(PermissionRequiredMixin, generic.DetailView):
model = Recruit
template_name = 'taxi/recruit.html'
def has_permission(self):
return self.request.user.profile.email_confirmed
def handle_no_permission(self):
error_message = '아직 인증이 완료되지 않았습니다. 이메일 인증을 완료해주세요! :)'
if self.raise_exception:
raise PermissionDenied(self.get_permission_denied_message())
return render(self.request, 'taxi/info.html', {'error_message': error_message})
def get_context_data(self, **kwargs):
context = super(RecruitView, self).get_context_data(**kwargs)
#pdb.set_trace()
img_var = self.get_object().taxi_popnow*10 + self.get_object().taxi_poptot
img_name = str(img_var)
context['img_name'] = img_name
context['ApplyForm'] = ApplyForm()
return context
MY model.py :
class Recruit(models.Model):
taxi_time = models.TimeField('출발 시각')
taxi_is_closed = models.BooleanField('마감', default=False)
def chk_closed(self):
now = datetime.datetime.now()
taxi_datetime = datetime.datetime.combine(self.taxi_date, self.taxi_time)
is_full = self.taxi_poptot <= self.taxi_popnow
is_past = taxi_datetime <= now
if (is_full or is_past):
self.taxi_is_closed = True
else:
self.taxi_is_closed = False
self.save()
I picked only related code.

You can overwrite the get_object method to call chk_closed on RecruitView.
class RecruitView(PermissionRequiredMixin, generic.DetailView):
....
def get_object(queryset=None):
obj = super(RecruitView, self).get_object(queryset=queryset)
obj.chk_closed()
return obj

You can do this inside your get_context_data function:
def get_context_data(self, **kwargs):
context = super(RecruitView, self).get_context_data(**kwargs)
#pdb.set_trace()
img_var = self.get_object().taxi_popnow*10 + self.get_object().taxi_poptot
img_name = str(img_var)
if self.object.taxi_time < datetime.now():
self.object.taxi_is_closed = True
self.object.save()
context['img_name'] = img_name
context['ApplyForm'] = ApplyForm()
return context

Related

Changes to Django Template is not reflecting

I followed the instructions on https://github.com/tomwalker/django_quiz to use this project.
I am able to successfully use the project.
However, when I change the template (.html files) nothing changes. Even If I add or delete the entire content. I am not sure if I am missing something.
I checked in views.py and I cannot see any html renders. I am new to Django and finding it difficult to understand views.py and make any changes to the templates like questions or category. Any help would be greatly appreciated.
Interestingly if I make any changes to my original base.html the css and styles are applied as well as any other changes in base.html
urls.py code
urlpatterns = [
url(r'^$',
view=QuizListView.as_view(),
name='quiz_index'),
url(r'^category/$',
view=CategoriesListView.as_view(),
name='quiz_category_list_all'),
url(r'^category/(?P<category_name>[\w|\W-]+)/$',
view=ViewQuizListByCategory.as_view(),
name='quiz_category_list_matching'),
url(r'^progress/$',
view=QuizUserProgressView.as_view(),
name='quiz_progress'),
url(r'^marking/$',
view=QuizMarkingList.as_view(),
name='quiz_marking'),
url(r'^marking/(?P<pk>[\d.]+)/$',
view=QuizMarkingDetail.as_view(),
name='quiz_marking_detail'),
# passes variable 'quiz_name' to quiz_take view
url(r'^(?P<slug>[\w-]+)/$',
view=QuizDetailView.as_view(),
name='quiz_start_page'),
url(r'^(?P<quiz_name>[\w-]+)/take/$',
view=QuizTake.as_view(),
name='quiz_question'),
]
Views.py code
class QuizMarkerMixin(object):
#method_decorator(login_required)
#method_decorator(permission_required('quiz.view_sittings'))
def dispatch(self, *args, **kwargs):
return super(QuizMarkerMixin, self).dispatch(*args, **kwargs)
class SittingFilterTitleMixin(object):
def get_queryset(self):
queryset = super(SittingFilterTitleMixin, self).get_queryset()
quiz_filter = self.request.GET.get('quiz_filter')
if quiz_filter:
queryset = queryset.filter(quiz__title__icontains=quiz_filter)
return queryset
class QuizListView(ListView):
model = Quiz
def get_queryset(self):
queryset = super(QuizListView, self).get_queryset()
return queryset.filter(draft=False)
class QuizDetailView(DetailView):
model = Quiz
slug_field = 'url'
def get(self, request, *args, **kwargs):
self.object = self.get_object()
if self.object.draft and not request.user.has_perm('quiz.change_quiz'):
raise PermissionDenied
context = self.get_context_data(object=self.object)
return self.render_to_response(context)
class CategoriesListView(ListView):
model = Category
class ViewQuizListByCategory(ListView):
model = Quiz
template_name = 'view_quiz_category.html'
def dispatch(self, request, *args, **kwargs):
self.category = get_object_or_404(
Category,
category=self.kwargs['category_name']
)
return super(ViewQuizListByCategory, self).\
dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(ViewQuizListByCategory, self)\
.get_context_data(**kwargs)
context['category'] = self.category
return context
def get_queryset(self):
queryset = super(ViewQuizListByCategory, self).get_queryset()
return queryset.filter(category=self.category, draft=False)
class QuizUserProgressView(TemplateView):
template_name = 'progress.html'
#method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
return super(QuizUserProgressView, self)\
.dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(QuizUserProgressView, self).get_context_data(**kwargs)
progress, c = Progress.objects.get_or_create(user=self.request.user)
context['cat_scores'] = progress.list_all_cat_scores
context['exams'] = progress.show_exams()
return context
class QuizMarkingList(QuizMarkerMixin, SittingFilterTitleMixin, ListView):
model = Sitting
def get_queryset(self):
queryset = super(QuizMarkingList, self).get_queryset()\
.filter(complete=True)
user_filter = self.request.GET.get('user_filter')
if user_filter:
queryset = queryset.filter(user__username__icontains=user_filter)
return queryset
class QuizMarkingDetail(QuizMarkerMixin, DetailView):
model = Sitting
def post(self, request, *args, **kwargs):
sitting = self.get_object()
q_to_toggle = request.POST.get('qid', None)
if q_to_toggle:
q = Question.objects.get_subclass(id=int(q_to_toggle))
if int(q_to_toggle) in sitting.get_incorrect_questions:
sitting.remove_incorrect_question(q)
else:
sitting.add_incorrect_question(q)
return self.get(request)
def get_context_data(self, **kwargs):
context = super(QuizMarkingDetail, self).get_context_data(**kwargs)
context['questions'] =\
context['sitting'].get_questions(with_answers=True)
return context
class QuizTake(FormView):
form_class = QuestionForm
template_name = 'question.html'
result_template_name = 'result.html'
single_complete_template_name = 'single_complete.html'
def dispatch(self, request, *args, **kwargs):
self.quiz = get_object_or_404(Quiz, url=self.kwargs['quiz_name'])
if self.quiz.draft and not request.user.has_perm('quiz.change_quiz'):
raise PermissionDenied
try:
self.logged_in_user = self.request.user.is_authenticated()
except TypeError:
self.logged_in_user = self.request.user.is_authenticated
if self.logged_in_user:
self.sitting = Sitting.objects.user_sitting(request.user,
self.quiz)
else:
self.sitting = self.anon_load_sitting()
if self.sitting is False:
return render(request, self.single_complete_template_name)
return super(QuizTake, self).dispatch(request, *args, **kwargs)
def get_form(self, *args, **kwargs):
if self.logged_in_user:
self.question = self.sitting.get_first_question()
self.progress = self.sitting.progress()
else:
self.question = self.anon_next_question()
self.progress = self.anon_sitting_progress()
if self.question.__class__ is Essay_Question:
form_class = EssayForm
else:
form_class = self.form_class
return form_class(**self.get_form_kwargs())
def get_form_kwargs(self):
kwargs = super(QuizTake, self).get_form_kwargs()
return dict(kwargs, question=self.question)
def form_valid(self, form):
if self.logged_in_user:
self.form_valid_user(form)
if self.sitting.get_first_question() is False:
return self.final_result_user()
else:
self.form_valid_anon(form)
if not self.request.session[self.quiz.anon_q_list()]:
return self.final_result_anon()
self.request.POST = {}
return super(QuizTake, self).get(self, self.request)
def get_context_data(self, **kwargs):
context = super(QuizTake, self).get_context_data(**kwargs)
context['question'] = self.question
context['quiz'] = self.quiz
if hasattr(self, 'previous'):
context['previous'] = self.previous
if hasattr(self, 'progress'):
context['progress'] = self.progress
return context
def form_valid_user(self, form):
progress, c = Progress.objects.get_or_create(user=self.request.user)
guess = form.cleaned_data['answers']
is_correct = self.question.check_if_correct(guess)
if is_correct is True:
self.sitting.add_to_score(1)
progress.update_score(self.question, 1, 1)
else:
self.sitting.add_incorrect_question(self.question)
progress.update_score(self.question, 0, 1)
if self.quiz.answers_at_end is not True:
self.previous = {'previous_answer': guess,
'previous_outcome': is_correct,
'previous_question': self.question,
'answers': self.question.get_answers(),
'question_type': {self.question
.__class__.__name__: True}}
else:
self.previous = {}
self.sitting.add_user_answer(self.question, guess)
self.sitting.remove_first_question()
def final_result_user(self):
results = {
'quiz': self.quiz,
'score': self.sitting.get_current_score,
'max_score': self.sitting.get_max_score,
'percent': self.sitting.get_percent_correct,
'sitting': self.sitting,
'previous': self.previous,
}
self.sitting.mark_quiz_complete()
if self.quiz.answers_at_end:
results['questions'] =\
self.sitting.get_questions(with_answers=True)
results['incorrect_questions'] =\
self.sitting.get_incorrect_questions
if self.quiz.exam_paper is False:
self.sitting.delete()
return render(self.request, self.result_template_name, results)
def anon_load_sitting(self):
if self.quiz.single_attempt is True:
return False
if self.quiz.anon_q_list() in self.request.session:
return self.request.session[self.quiz.anon_q_list()]
else:
return self.new_anon_quiz_session()
def new_anon_quiz_session(self):
"""
Sets the session variables when starting a quiz for the first time
as a non signed-in user
"""
self.request.session.set_expiry(259200) # expires after 3 days
questions = self.quiz.get_questions()
question_list = [question.id for question in questions]
if self.quiz.random_order is True:
random.shuffle(question_list)
if self.quiz.max_questions and (self.quiz.max_questions
< len(question_list)):
question_list = question_list[:self.quiz.max_questions]
# session score for anon users
self.request.session[self.quiz.anon_score_id()] = 0
# session list of questions
self.request.session[self.quiz.anon_q_list()] = question_list
# session list of question order and incorrect questions
self.request.session[self.quiz.anon_q_data()] = dict(
incorrect_questions=[],
order=question_list,
)
return self.request.session[self.quiz.anon_q_list()]
def anon_next_question(self):
next_question_id = self.request.session[self.quiz.anon_q_list()][0]
return Question.objects.get_subclass(id=next_question_id)
def anon_sitting_progress(self):
total = len(self.request.session[self.quiz.anon_q_data()]['order'])
answered = total - len(self.request.session[self.quiz.anon_q_list()])
return (answered, total)
def form_valid_anon(self, form):
guess = form.cleaned_data['answers']
is_correct = self.question.check_if_correct(guess)
if is_correct:
self.request.session[self.quiz.anon_score_id()] += 1
anon_session_score(self.request.session, 1, 1)
else:
anon_session_score(self.request.session, 0, 1)
self.request\
.session[self.quiz.anon_q_data()]['incorrect_questions']\
.append(self.question.id)
self.previous = {}
if self.quiz.answers_at_end is not True:
self.previous = {'previous_answer': guess,
'previous_outcome': is_correct,
'previous_question': self.question,
'answers': self.question.get_answers(),
'question_type': {self.question
.__class__.__name__: True}}
self.request.session[self.quiz.anon_q_list()] =\
self.request.session[self.quiz.anon_q_list()][1:]
def final_result_anon(self):
score = self.request.session[self.quiz.anon_score_id()]
q_order = self.request.session[self.quiz.anon_q_data()]['order']
max_score = len(q_order)
percent = int(round((float(score) / max_score) * 100))
session, session_possible = anon_session_score(self.request.session)
if score is 0:
score = "0"
results = {
'score': score,
'max_score': max_score,
'percent': percent,
'session': session,
'possible': session_possible
}
del self.request.session[self.quiz.anon_q_list()]
if self.quiz.answers_at_end:
results['questions'] = sorted(
self.quiz.question_set.filter(id__in=q_order)
.select_subclasses(),
key=lambda q: q_order.index(q.id))
results['incorrect_questions'] = (
self.request
.session[self.quiz.anon_q_data()]['incorrect_questions'])
else:
results['previous'] = self.previous
del self.request.session[self.quiz.anon_q_data()]
return render(self.request, 'result.html', results)
def anon_session_score(session, to_add=0, possible=0):
"""
Returns the session score for non-signed in users.
If number passed in then add this to the running total and
return session score.
examples:
anon_session_score(1, 1) will add 1 out of a possible 1
anon_session_score(0, 2) will add 0 out of a possible 2
x, y = anon_session_score() will return the session score
without modification
Left this as an individual function for unit testing
"""
if "session_score" not in session:
session["session_score"], session["session_score_possible"] = 0, 0
if possible > 0:
session["session_score"] += to_add
session["session_score_possible"] += possible
return session["session_score"], session["session_score_possible"]
When I make changes to etbox/templates/base.html , my changes are reflected in all the Quiz Html(s).
This is how your links and templates should link up:
You first create a url address in your apps directory folder in file called urls.py:
"""Defines the URL patterns for app created within django"""
from django.conf.urls import url
from . import views
urlpatterns = [
# Home page
url(r'^$', views.index, name='index'),#notice how I mention the function called index within the views.py file
...
]
Then you add a function within the same folder as your urls.py that allows to carry information from your models and forms into your templates (but that is optional).
def index(request):
"""Creating a homepage view"""
return render(request, '#app_name/index.html')
When creating an .html file remember that it's supposed to located in a specific location for django to read it. This is most likely your problem. Your .html file isn't in the right location for django to render it.
This is the general file path from your main project directory for the .html file. #main_directory/#django_app_directory/#templates/#django_app_name_folder/.html_file
. So basically the .html file has to be located in a folder called templates within the same directory as your views.py and urls.py. Inside the templates folder you make another folder that is called the same as your app name folder. Within this app name folder you can put your .html file.
I just had a quick look at it and it seems in views.py that he's using just generic views, that's why he never calls the render function directly.
So, as you can see in urls.py, the home page is associated with QuizListView from views.py QuizListView inherits from django.views.generic.ListView
If you look at the documentation, you will see that the default template name for that is the name of the model you specify + '_list'
class QuizListView(ListView):
model = Quiz
def get_queryset(self):
queryset = super(QuizListView, self).get_queryset()
return queryset.filter(draft=False)
This template is in this path: django_quiz/quiz/templates/quiz/quiz_list.html
Edit it and the changes should reflect in the browser when you refresh the page

Django: 'UtilisateurUpdateView' object has no attribute 'object'

I develop a Django project with inlineformset nested using FormView.
I first develop my form using CreateView/UpdateView and it works but when I use FormView I got an error
'UtilisateurUpdateView' object has no attribute 'object'
Why I can get access 'object' when I use UpdateView but not with FormView ?
I have read that it could come from override method but here doesn't seems to be the case ?
forms.py
NAME = Thesaurus.options_list(2,'fr')
ACCESS = Thesaurus.options_list(3,'fr')
ApplicationFormset = inlineformset_factory(
UtilisateurProjet, Application, #Utilisateur, Application,
fields=('app_app_nom','app_dro'),
widgets={
'app_app_nom': forms.Select(choices=NAME),
'app_dro': forms.Select(choices=ACCESS)
},
extra=3,
can_delete=True,
)
class UtilisateurProjetUpdateForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop("request")
super(UtilisateurProjetUpdateForm, self).__init__(*args, **kwargs)
self.fields["pro_ide"] = forms.ModelChoiceField(queryset = PROJETS, label = "Nom projet", widget = forms.HiddenInput(), initial = Projet.objects.get(pro_ide=self.request['projet']))
self.fields["uti_ide"] = forms.ModelChoiceField(queryset = UTILISATEURS, label = "Nom, prénom de l'utilisateur", widget = forms.Select, initial = Utilisateur.objects.get(uti_ide=self.request['utilisateur']))
class Meta:
model = UtilisateurProjet
fields = ('pro_ide','uti_ide',)
views.py
class UtilisateurUpdateView(FormView):
template_name = 'project/utilisateurprojet_form.html'
form_class = UtilisateurProjetUpdateForm
def get_form_kwargs(self):
kwargs = super(UtilisateurUpdateView, self).get_form_kwargs()
kwargs['request'] = dict(utilisateur = self.kwargs['pk'], projet = self.kwargs['projet'])
# kwargs['request'] = self.request
# print('projet',self.kwargs['projet'])
# print('utilisateur',self.kwargs['pk'])
return kwargs
def get_context_data(self, **kwargs):
data = super(UtilisateurUpdateView,self).get_context_data(**kwargs)
# print('projet',self.kwargs['projet'])
# print('utilisateur',self.kwargs['pk'])
instance = UtilisateurProjet.objects.get(pro_ide=self.kwargs['projet'],uti_ide=self.kwargs['pk'])
data['projet'] = Projet.objects.get(pro_ide=self.kwargs['projet'])
data['utilisateur_app'] = Utilisateur.objects.get(uti_ide=self.kwargs['pk'])
if self.request.POST:
data["utilisateur"] = self.request.user.username
data["user_profil"] = self.request.session.get('user_profil')
data["application"] = ApplicationFormset(self.request.POST, instance=instance)
else:
data["application"] = ApplicationFormset(instance=instance)
return data
def form_valid(self, form):
# Setting commit to False will return the object without saving it to the Database.
self.object = form.save(commit=False)
context = self.get_context_data()
application = context["application"]
user_profil = context["user_profil"]
if user_profil == 'Investigateur':
self.object.uti_val = 0 # demande modifiée par investigateur -> repasse à non validée + envoie de mail
elif user_profil == 'Moniteur':
self.object.uti_val = 1 # demande validée par moniteur -> validée + envoie de mail
self.object.uti_val_dat = timezone.now()
else:
self.object.uti_val = 0
# After doing our own changes to the object, we can save it.
self.object.save()
if application.is_valid():
# Not sure what is happening here, but this statement does nothing by itself.
# form.instance = self.object
application.save()
return super().form_valid(form)
def get_success_url(self):
return reverse("project:index")
FormView and DetailView are different classes from different packages: django.views.generic.edit.FormView and django.views.generic.detail.DetailView respectively.
From the docs of DetailView:
While this view is executing, self.object will contain the object that
the view is operating upon.
FormView doesn't have an object property, because it doesn't necessarily work with an object.
However, since you're using ModelForms, you should be able to access the Form's object after calling form.save():
def form_valid(self, form):
# Setting commit to False will return the object without saving it to the Database.
self.object = form.save(commit=False)
context = self.get_context_data()
application = context["application"]
user_profil = context["user_profil"]
self.object.uti_val = 1
self.object.uti_val_dat = timezone.now()
else:
self.object.uti_val = 0
# After doing our own changes to the object, we can save it.
self.object.save()
if application.is_valid():
# Not sure what is happening here, but this statement does nothing by itself.
form.instance = self.object
application.save()
return super().form_valid(form)

Django: One function, two class-based views

I am currently struggling to find a better solution for get_survey_state(self, context).
It is in both CBVs and I think there is a better solution than mine. Can you advise me on that?
views.py
class SurveyExpectations(AdminPermissionRequiredMixin, TemplateView):
template_name = 'admin/surveys/expectations.html'
def get_survey_state(self, context):
survey = self.request.event.surveys.active_pre_event().first()
answers = Answer.objects.filter(question__survey=survey).exists()
context['survey_is_active'] = survey
context['answers_exist'] = answers
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
self.get_survey_state(context)
context['questions_and_answers'] = self.request.event.surveys.get_results(
settings.SURVEY_PRE_EVENT
)
return context
class SurveyFeedback(AdminPermissionRequiredMixin, TemplateView):
template_name = 'admin/surveys/feedback.html'
def get_net_promoter_score(self) -> float:
[...]
return netpromoterscore(scores)
def get_average_age(self) -> int:
[...]
return int(answers['avg']) if answers['avg'] else None
def get_survey_state(self, context):
survey = self.request.event.surveys.active_post_event().first()
answers = Answer.objects.filter(question__survey=survey).exists()
context['survey_is_active'] = survey
context['answers_exist'] = answers
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
self.get_survey_state(context)
context['questions_and_answers'] = self.request.event.surveys.get_results(
settings.SURVEY_POST_EVENT
)
context['netpromoterscore'] = self.get_net_promoter_score()
context['average_age'] = self.get_average_age()
return context
models.py
class SurveyQuerySet(models.QuerySet):
def active_pre_event(self):
return self.filter(is_active=True, template=settings.SURVEY_PRE_EVENT)
def active_post_event(self):
return self.filter(is_active=True, template=settings.SURVEY_POST_EVENT)
def get_results(self, template):
return (
self.get(template=template)
.questions.exclude(focus=QuestionFocus.EMAIL)
.all()
.prefetch_related('answers')
)
class Survey(TimeStampedModel):
id = models.UUIDField([...])
is_active = models.BooleanField([...])
template = models.CharField([...])
objects = SurveyQuerySet.as_manager()
You can use class inheritance. You create a Base Class (derived from TemplateView) in which you define all your common functionalities.
Then you can derive further views from the base class, which will inherit all functionality.
The get_survey_state uses the method self.get_survey() to allow using different retrieval methods in the derived views.
class BaseSurveyView(TemplateView):
def get_survey_state(self, context):
survey = self.get_survey()
answers = Answer.objects.filter(question__survey=survey).exists()
context['survey_is_active'] = survey
context['answers_exist'] = answers
def get_survey(self):
raise NotImplementedError
class SurveyExpectations(AdminPermissionRequiredMixin, BaseSurveyView):
template_name = 'admin/surveys/expectations.html'
def get_survey(self):
return self.request.event.surveys.active_pre_event().first()
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
self.get_survey_state(context)
context['questions_and_answers'] = self.request.event.surveys.get_results(
settings.SURVEY_PRE_EVENT
)
return context
class SurveyFeedback(AdminPermissionRequiredMixin, BaseSurveyView):
template_name = 'admin/surveys/feedback.html'
def get_survey(self):
return self.request.event.surveys.active_post_event().first()
def get_net_promoter_score(self) -> float:
[...]
return netpromoterscore(scores)
def get_average_age(self) -> int:
[...]
return int(answers['avg']) if answers['avg'] else None
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
self.get_survey_state(context)
context['questions_and_answers'] = self.request.event.surveys.get_results(
settings.SURVEY_POST_EVENT
)
context['netpromoterscore'] = self.get_net_promoter_score()
context['average_age'] = self.get_average_age()
return context

'class' object has no attribute 'object'

What am i doing wrong here. I have been trying to figure this out for hours. I think i am having issues with Django get_context_data function.
Error is 'PatientBedAllotmentList' object has no attribute 'object'
views.py
#method_decorator(login_required, name='dispatch')
class PatientBedAllotmentList(ListView):
model = BedAllotment
template_name = 'room/bed_allotment_list.html'
def get_context_data(self, **kwargs):
context = super(PatientBedAllotmentList, self).get_context_data(**kwargs)
start = BedAllotment.objects.get(id=self.object.id).allotment_date
end = BedAllotment.objects.get(id=self.object.id).departure_date
amount = BedCreate.objects.get(id=self.object.id).cost
days_number = abs((end - start).days)
days_number = int(days_number)
amount_due = amount * days_number
context['account_type'] = AccountUser.objects.get(user_id=self.request.user.id)
hospital_id = AccountUser.objects.get(user_id=self.request.user.id).hospital_id
allotment_details = BedAllotment.objects.filter(hospital_id=hospital_id)
context['allotment'] = allotment_details
context['amount'] = amount_due
return context
urls.py
from django.conf.urls import url
from medisaver.room import views
urlpatterns = [
url(r'^room-category/create/$', views.RoomCategoryCreate.as_view(), name='room_category_create'),
url(r'^room-category/list/$', views.RoomCategoryList.as_view(), name='room_category_list'),
url(r'^room-category/update/(?P<hospital_id>[0-9A-Fa-f-]+)/(?P<category_id>[0-9]+)/$', views.RoomCategoryUpdate.as_view(), name='room_category_update'),
url(r'^room-category/delete/(?P<hospital_id>[0-9A-Fa-f-]+)/(?P<category_id>[0-9]+)/$', views.RoomCategoryDelete.as_view(), name='room_category_delete'),
url(r'^hospital-rooms/list/$', views.RoomList.as_view(), name='room_list'),
url(r'^hospital-rooms/create/$', views.RoomCreateView.as_view(), name='room_create'),
url(r'^hospital-rooms/update/(?P<category_id>[0-9]+)/(?P<room_id>[0-9]+)/$', views.RoomUpdate.as_view(), name='room_update'),
url(r'^hospital-rooms/delete/(?P<category_id>[0-9]+)/(?P<room_id>[0-9]+)/$', views.RoomDelete.as_view(), name='room_delete'),
url(r'^hospital-rooms/beds/create/$', views.BedCreateView.as_view(), name='bed_create'),
url(r'^hospital-rooms/beds/list/$', views.BedList.as_view(), name='bed_list'),
url(r'^hospital-rooms/beds/update/(?P<room_id>[0-9]+)/(?P<bed_id>[0-9]+)/$', views.BedUpdate.as_view(), name='bed_update'),
url(r'^hospital-rooms/beds/delete/(?P<room_id>[0-9]+)/(?P<bed_id>[0-9]+)/$', views.BedDelete.as_view(), name='bed_delete'),
url(r'^hospital-rooms/beds/patient-bed-allotment/$', views.BedAllotmentCreate.as_view(), name='bed_allotment'),
url(r'^hospital/discharge-patient/(?P<allotment_id>[0-9]+)/(?P<patient_id>[0-9A-Fa-f-]+)/$', views.BedDischarge.as_view(), name='patient_bed_discharge'),
url(r'^hospital/bed-allotment-list/$', views.PatientBedAllotmentList.as_view(), name='patient_bed_list'),
]
self.object does not make any sense in ListView.
If you want to get stay_time then you can do it in your model and access in template using object.stay_time and even you can calculate the amount in template by multiplying. But I You can even do it in detailview. Create a method in that model like
#property
def stay_time(self):
return (self.departure_date-self.allotment_date)
I was able to fix it by calling on form_valid function. I used the function on my BedDischarge class in my views. And was able to use self.object. Then made a template call in my templates.
#method_decorator(login_required, name='dispatch')
class BedDischarge(UpdateView):
model = BedAllotment
template_name = 'room/bed_discharge.html'
form_class = BedAllotmentUpdateForm
pk_url_kwarg = 'allotment_id'
success_url = reverse_lazy('patient_bed_list')
def get_context_data(self, **kwargs):
context = super(BedDischarge, self).get_context_data(**kwargs)
context['account_type'] = AccountUser.objects.get(user_id=self.request.user.id)
return context
def form_valid(self, form):
get_allot_id = self.object.id
bed_allot = BedAllotment.objects.get(id=get_allot_id)
start_time = bed_allot.allotment_date
end_time = form.instance.departure_date
cost = BedCreate.objects.get(id=self.object.bed_id).cost
days_spent = (end_time - start_time).days
amount = cost * days_spent
form.instance.days = days_spent
form.instance.amount = amount
return super(BedDischarge, self).form_valid(form)

Django CBV FormView get_intial form_valid not saving but it's saving with def post

class EditShipment(LoginRequiredMixin, FormView):
template_name = "add-edit-shipment.html"
model = Shipment
form_class = ShipmentForm
success_url = lazy(reverse,str)("shipment_listing")
def get_context_data(self, **kwargs):
context = super(EditShipment,self).get_context_data(**kwargs)
context['shpid'] = self.kwargs.get('shpid',None)
context['key'] = 'edit'
return context
def get_initial(self):
ship_obj = Shipment.objects.get(id=int(self.kwargs.get('shpid',None)))
stdr_obj = Shipment_Truck_Driver_Relation.objects.get(shipment = ship_obj)
return {'origin_address':ship_obj.origin_address,\
'destination_address':ship_obj.destination_address,\
'total_weight':ship_obj.total_weight,'pick_up':ship_obj.pick_up,\
'delivery':ship_obj.delivery,'amount':ship_obj.amount,\
'truck':stdr_obj.truck,'driver':stdr_obj.driver}
def get_form(self, form_class):
return form_class(initial=self.get_initial())
def form_valid(self,form):
import ipdb;ipdb.set_trace()
userprofile_obj = User_Profile.objects.get(user = self.request.user)
compuser_obj = Company_Users.objects.get(user_profile = userprofile_obj)
self.f = form.save(commit=False)
self.f.total_weight = self.request.POST.get('total_weight')
self.f.pickup_cutoff = self.request.POST.get('pick_up')
self.f.delivery_cutoff = self.request.POST.get('delivery')
self.f.customer, self.f.created_by = compuser_obj.company, userprofile_obj
self.f.save()
return super(EditShipment, self).form_valid(form)
Here form_valid is not saving but its not throwing any error, also the object values are not updated.
How to save in def form_valid?

Categories

Resources