How to manage PK when a view must be called with it - django

Hi guys I have an issue with my private keys.
I do not know what is the problem if someone could give me a hand it would be greatly appreciated.
the errror that I get is : Generic detail view ProjectDetailView must be called with either an object pk or a slug
my models are the following:
class Team(models.Model):
team_name = models.CharField(max_length=100, default = '')
team_hr_admin = models.ForeignKey(MyUser, blank=True, null=True)
members = models.ManyToManyField(MyUser, related_name="members")
def __str__(self):
return self.team_name
class Project(models.Model):
name = models.CharField(max_length=250)
team_id = models.ForeignKey(Team, blank=True, null=True)
project_hr_admin = models.ForeignKey('registration.MyUser', blank=True, null=True)
candidat_answers = models.ManyToManyField('survey.response')
def get_absolute_url(self):
return reverse('website:ProjectDetails', kwargs = {'pk1' : self.pk})
def __str__(self):
return self.name
my views :
class HomePage(TemplateView):
template_name= 'index.html'
class LinkTeam(generic.ListView):
template_name = 'link_project.html'
def get_queryset(self):
#import pdb; pdb.set_trace()
#team2 = Team.objects.all().filter(team_hr_admin = self.request.user)
queryset = Team.objects.filter(team_hr_admin=self.request.user)
return queryset
def TeamSelect(request):
import pdb; pdb.set_trace()
if request.method == "POST":
select_form = EditSelectTeam(request.user, request.POST)
if select_form.is_valid():
data = select_form.cleaned_data['team_choice']
obj2 = Project.objects.filter(project_hr_admin=request.user)
obj3 = obj2.latest('id')
if obj3.team_id == None:
obj3.team_id = data
obj3.save()
obj4 = obj3.team_id
obj5 = obj4.members.all()
for i in obj5:
current_site = get_current_site(request)
message = render_to_string('acc_join_email.html', {
'user': i.first_name,
'domain':current_site.domain,
})
mail_subject = 'You have been invited to SoftScores.com please LogIn to get access to the app'
to_email = i.email
email = EmailMessage(mail_subject, message, to=[to_email])
email.send()
messages.success(request, 'test')
return HttpResponseRedirect(reverse('website:ProjectDetails', kwargs={'pk1':obj3.id}))
else:
print('this project has already a team')
else:
print('Non Valid form')
else:
select_form = EditSelectTeam(request.user)
return render(request,'link_project.html',
{'select_form':select_form })
class HRIndex(generic.ListView):
#import pdb; pdb.set_trace()
template_name = "HR_index.html"
model = Project
class CandidateIndex(TemplateView):
#import pdb; pdb.set_trace()
template_name = "candidate_index.html"
class EmployeeIndex(TemplateView):
#import pdb; pdb.set_trace()
template_name = "employee_index.html"
def get_context_data(self, **kwargs):
context = super(EmployeeIndex, self).get_context_data(**kwargs)
surveys = Survey.objects.filter(is_published=True)
if not self.request.user.is_authenticated():
surveys = surveys.filter(need_logged_user=False)
context['surveys'] = surveys
return context
class ProjectCreate(CreateView, LoginRequiredMixin):
model = Project
fields = ['name']
template_name = 'project_form.html'
def form_valid(self, form):
form.instance.project_hr_admin = self.request.user
return super(ProjectCreate, self).form_valid(form)
class ProjectDetailView(generic.DetailView, LoginRequiredMixin):
#import pdb; pdb.set_trace()
model = Project
template_name = 'project_details.html'
def get_context_data(self, **kwargs):
context = super(ProjectDetailView, self).get_context_data(**kwargs)
try:
team_name = Project.objects.get(id=self.kwargs['pk1']).team_id.members.all()
context['team_name'] = team_name
except AttributeError:
pass
return context
class EmployeeDetailView(generic.DetailView, LoginRequiredMixin):
#import pdb; pdb.set_trace()
model = MyUser
template_name = 'Employee_Details.html'
def get_object(self, queryset=None):
return get_object_or_404(MyUser, pk=self.kwargs['pk2'], members__project=self.kwargs['pk1'])
def get_context_data(self, **kwargs):
context = super(EmployeeDetailView, self).get_context_data(**kwargs)
employee_name = MyUser.objects.get(id=self.kwargs['pk2'])
team_list = Project.objects.get(id=self.kwargs['pk1']).team_id.members.all()
team_list_pop = Project.objects.get(id=self.kwargs['pk1']).team_id.members.all().exclude(id=self.kwargs['pk2'])
context={
'employee_name' : employee_name,
'team_list' : team_list,
'team_list_pop' : team_list_pop
}
return context
class TeamCreate(CreateView):
model = Team
fields = ['team_name']
template_name = 'team_form.html'
def form_valid(self, form):
#import pdb; pdb.set_trace()
valid = super(TeamCreate, self).form_valid(form)
form.instance.team_hr_admin = self.request.user
obj = form.save()
#SELECT * FROM project WHERE user = 'current_user' AND team_id = NULL
obj2 = Project.objects.get(project_hr_admin=self.request.user, team_id=None)
obj2.team_id = obj
obj2.save()
return valid
return super(TeamCreate, self).form_valid(form)
def get_success_url(self):
#import pdb; pdb.set_trace()
project = Project.objects.get(team_id=None, project_hr_admin=self.request.user)
return project.get_absolute_url()
my urls:
urlpatterns = [
url(r'^hr_index/$', views.HRIndex.as_view(), name='hr_index'),
url(r'^candidate_index/$', views.CandidateIndex.as_view(),name='candidate_index'),
url(r'^employee_index/$', views.EmployeeIndex.as_view(),name='employee_index'),
url(r'^addproject/$', views.ProjectCreate.as_view(), name='add_project'),
url(r'^project/(?P<pk1>[0-9]+)/addteam/$', views.TeamCreate.as_view(), name='add_team'),
url(r'^project/(?P<pk1>[0-9]+)/linkteam/$', views.LinkTeam.as_view(), name='link_team'),
url(r'^project/(?P<pk1>[0-9]+)/linkteam2/$', views.TeamSelect, name='team_select'),
url(r'^project/(?P<pk1>[0-9]+)/$',views.ProjectDetailView.as_view(), name='ProjectDetails'),
url(r'^project/(?P<pk1>[0-9]+)/api/chart/data2/$',views.TeamChartData.as_view(), name='TeamChartData'),
url(r'^project/(?P<pk1>[0-9]+)/(?P<pk2>[0-9]+)/$',views.EmployeeDetailView.as_view(), name='EmployeDetails'),
url(r'^project/(?P<pk1>[0-9]+)/(?P<pk2>[0-9]+)/api/chart/data/$',views.EmployeeChartData.as_view(), name='EmployeeChartData'),
What am I messing up here ?

DetailView's get_object method is looking for pk url argument. Because you have only pk1 url argument it raise error. You need to rename argument in url to pk:
url(r'^project/(?P<pk>[0-9]+)/$',views.ProjectDetailView.as_view(), name='ProjectDetails')
or override get_object method like you did in EmployeeDetailView.
You can also try to define pk_url_kwarg inside ProjectDetailView like this:
class ProjectDetailView(generic.DetailView, LoginRequiredMixin):
#import pdb; pdb.set_trace()
model = Project
template_name = 'project_details.html'
pk_url_kwarg = 'pk1'
In this case you need not to change url pattern or override get_object.

Related

prepoluate a generec createview

i want that a form is prepoluate with data
my model:
TYPE = (("S",'Swing'),
("R","Rapide"))
class valuation(models.Model):
stock = models.ForeignKey("stock",on_delete=models.CASCADE,related_name='valuation',)
date = models.DateField(auto_created=True)
val_type = models.CharField(choices=TYPE, max_length=1,default='R')
user = models.ForeignKey("users.User", on_delete=models.CASCADE)
def __str__(self):
return f"{self.stock} - {self.date} - {self.val_type}"
my view:
class valuationCreateviewSwing(CreateView):
template_name = "evaluation/evaluation_create.html"
form_class = valuationModeform
def get_form_kwargs(self): # prepopulate form
kwargs = super(valuationCreateviewSwing, self).get_form_kwargs()
stck = get_object_or_404(stock, pk=self.kwargs['pk'])
kwargs['user'] = self.request.user
kwargs['val_type'] = "S"
kwargs['stock'] = stck
return kwargs
def get_context_data(self, **kwargs):
# we need to overwrite get_context_data
# to make sure that our formset is rendered
data = super().get_context_data(**kwargs)
if self.request.POST:
data["val_detail"] = ChildFormset1(self.request.POST)
else:
data["val_detail"] = ChildFormset1()
data.update({
"typeVal": "Swing",})
return data
def form_valid(self, form):
context = self.get_context_data()
val_detail_Swing = context["val_detail_Swing"]
self.object = form.save(commit=False)
# add data info neede about valuation model
self.object = form.save()
if val_detail_Swing.is_valid():
val_detail_Swing.instance = self.object
val_detail_Swing.save()
return super().form_valid(form)
def get_success_url(self):
return reverse("stock:stock-list")
I've a child form in my view (this part works ok):
ChildFormset1 = inlineformset_factory(
valuation, val_detail_Swing, form=valuationSwingModelform, can_delete=False)
I tried to use ge_for_kwargs but it seems not working as I've an error message :
init() got an unexpected keyword argument 'user'
You can use get_initial() method:
class valuationCreateviewSwing(CreateView):
template_name = "evaluation/evaluation_create.html"
form_class = valuationModeform
def get_initial(self):
query = self.request.GET
return {
'user': self.request.user.pk
'val_type': "S",
'stock': self.kwargs.get('pk')
}
...
Or you should override __init__() method and stay to use get_form_kwargs()
class valuationModeform(ModelForm):
class Meta:
model = Valuation
fields = '__all__'
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
val_type = kwargs('val_type', None)
stock = kwargs.pop('stock', None)
super().__init__(*args, **kwargs)
# assign initial values
self.fields['user'].initial = user
self.fields['val_type'].initial = val_type
self.fields['stock'].initial = stock

NoReverseMatch not matching key argument

I have a response error that is driving me crazy, I tried everything but no way to find why am I getting that error :
django.urls.exceptions.NoReverseMatch: Reverse for 'team_select' with keyword arguments '{'pk1': ''}' not found.
1 pattern(s) tried: ['website/project/(?P<pk1>[0-9]+)/linkteam2/$']
that is my views:
class HomePage(TemplateView):
template_name= 'index.html'
class LinkTeam(generic.ListView):
template_name = 'link_project.html'
def get_queryset(self):
#import pdb; pdb.set_trace()
#team2 = Team.objects.all().filter(team_hr_admin = self.request.user)
queryset = Team.objects.filter(team_hr_admin=self.request.user)
return queryset
def TeamSelect(request):
import pdb; pdb.set_trace()
if request.method == "POST":
select_form = EditSelectTeam(request.user, request.POST)
if select_form.is_valid():
data = select_form.cleaned_data['team_choice']
obj2 = Project.objects.filter(project_hr_admin=request.user)
obj3 = obj2.latest('id')
if obj3.team_id == None:
obj3.team_id = data
obj3.save()
obj4 = obj3.team_id
obj5 = obj4.members.all()
for i in obj5:
current_site = get_current_site(request)
message = render_to_string('acc_join_email.html', {
'user': i.first_name,
'domain':current_site.domain,
})
mail_subject = 'You have been invited to SoftScores.com please LogIn to get access to the app'
to_email = i.email
email = EmailMessage(mail_subject, message, to=[to_email])
email.send()
messages.success(request, 'test')
return HttpResponseRedirect(reverse('website:ProjectDetails', kwargs={'pk':obj3.id}))
else:
print('this project has already a team')
else:
print('Non Valid form')
else:
select_form = EditSelectTeam(request.user)
return render(request,'link_project.html',
{'select_form':select_form })
class HRIndex(generic.ListView):
#import pdb; pdb.set_trace()
template_name = "HR_index.html"
model = Project
class CandidateIndex(TemplateView):
#import pdb; pdb.set_trace()
template_name = "candidate_index.html"
class EmployeeIndex(TemplateView):
#import pdb; pdb.set_trace()
template_name = "employee_index.html"
def get_context_data(self, **kwargs):
context = super(EmployeeIndex, self).get_context_data(**kwargs)
surveys = Survey.objects.filter(is_published=True)
if not self.request.user.is_authenticated():
surveys = surveys.filter(need_logged_user=False)
context['surveys'] = surveys
return context
class ProjectCreate(LoginRequiredMixin,CreateView):
model = Project
fields = ['name']
template_name = 'project_form.html'
def form_valid(self, form):
form.instance.project_hr_admin = self.request.user
return super(ProjectCreate, self).form_valid(form)
class ProjectDetailView(LoginRequiredMixin,generic.DetailView):
#import pdb; pdb.set_trace()
model = Project
template_name = 'project_details.html'
def get_object(self, queryset=None):
return get_object_or_404(Project,id=self.kwargs['pk1'])
def get_context_data(self, **kwargs):
context = super(ProjectDetailView, self).get_context_data(**kwargs)
try:
team_name = Project.objects.get(id=self.kwargs['pk1']).team_id.members.all()
context['team_name'] = team_name
except AttributeError:
pass
return context
class EmployeeDetailView(LoginRequiredMixin, generic.DetailView):
#import pdb; pdb.set_trace()
model = MyUser
template_name = 'Employee_Details.html'
def get_object(self, queryset=None):
return get_object_or_404(MyUser, pk=self.kwargs['pk2'], members__project=self.kwargs['pk1'])
def get_context_data(self, **kwargs):
context = super(EmployeeDetailView, self).get_context_data(**kwargs)
employee_name = MyUser.objects.get(id=self.kwargs['pk2'])
team_list = Project.objects.get(id=self.kwargs['pk1']).team_id.members.all()
team_list_pop = Project.objects.get(id=self.kwargs['pk1']).team_id.members.all().exclude(id=self.kwargs['pk2'])
context={
'employee_name' : employee_name,
'team_list' : team_list,
'team_list_pop' : team_list_pop
}
return context
class TeamCreate(CreateView):
model = Team
fields = ['team_name']
template_name = 'team_form.html'
def form_valid(self, form):
#import pdb; pdb.set_trace()
valid = super(TeamCreate, self).form_valid(form)
form.instance.team_hr_admin = self.request.user
obj = form.save()
#SELECT * FROM project WHERE user = 'current_user' AND team_id = NULL
obj2 = Project.objects.get(project_hr_admin=self.request.user, team_id=None)
obj2.team_id = obj
obj2.save()
return valid
return super(TeamCreate, self).form_valid(form)
def get_success_url(self):
#import pdb; pdb.set_trace()
project = Project.objects.get(team_id=None, project_hr_admin=self.request.user)
return project.get_absolute_url()
URL:
from django.conf.urls import url, include
from website import views
app_name = 'website'
urlpatterns = [
url(r'^hr_index/$', views.HRIndex.as_view(), name='hr_index'),
url(r'^candidate_index/$', views.CandidateIndex.as_view(),name='candidate_index'),
url(r'^employee_index/$', views.EmployeeIndex.as_view(),name='employee_index'),
url(r'^addproject/$', views.ProjectCreate.as_view(), name='add_project'),
url(r'^project/(?P<pk1>[0-9]+)/addteam/$', views.TeamCreate.as_view(), name='add_team'),
url(r'^project/(?P<pk1>[0-9]+)/linkteam/$', views.LinkTeam.as_view(), name='link_team'),
url(r'^project/(?P<pk1>[0-9]+)/linkteam2/$', views.TeamSelect, name='team_select'),
url(r'^project/(?P<pk1>[0-9]+)/$',views.ProjectDetailView.as_view(), name='ProjectDetails'),
url(r'^project/(?P<pk1>[0-9]+)/api/chart/data2/$',views.TeamChartData.as_view(), name='TeamChartData'),
url(r'^project/(?P<pk1>[0-9]+)/(?P<pk2>[0-9]+)/$',views.EmployeeDetailView.as_view(), name='EmployeDetails'),
url(r'^project/(?P<pk1>[0-9]+)/(?P<pk2>[0-9]+)/api/chart/data/$',views.EmployeeChartData.as_view(), name='EmployeeChartData'),
#url(r'^project/(?P<pk>[0-9]+)/api/chart/data/$', views.ChartData.as_view(), name='chartdata'),
]
the keyword argument say that pk1 is empty when it should not since I am in the page http://127.0.0.1:8000/website/project/2/
My template look like...................................
{% load static %}
<div class="invite-team">
<div class="jumbotron greenback">
<div class="jumbo-text">
<h7>Your project has been created, It is time to link a team or create a new for your project</h3>
</div>
<div class="jumbo-button">
<span class="fa fa-link"></span> Link an existing team
<span class="fa fa-plus-circle"></span> Create a new team
</div>
</div>
</div>
edit:
the error appeared after I added :
renderer_classes = [TemplateHTMLRenderer]
template_name = 'project_details.html'
class TeamChartData(APIView):
queryset = MyUser.objects.all()
serializer_class = MyUserSerializer, #ProjectSerializer
permission_classes = []
http_method_names = ['get',]
renderer_classes = [TemplateHTMLRenderer]
template_name = 'project_details.html'
def get_serializer_class(self):
return self.serializer_class
def get(self, request, format=None, *args, **kwargs):
chunk_team = get_team_info_score(self)
motiv_team = get_team_motivation_score(self)
action_team = get_team_action_score(self)
behav_team = get_behaviour_action_score(self)
team_complete = get_team_complete_data(self)
cohesiveness_score = get_team_cohesivenss_score(self)
info_dist = get_question_similarities(self)[0]
motiv_dist = get_question_similarities(self)[1]
action_dist = get_question_similarities(self)[2]
behav_dist = get_question_similarities(self)[3]
data = {
"team_info_score":chunk_team,
"team_motiv_score":motiv_team,
"team_action_score":action_team,
"team_behaviour_score":behav_team,
"team_complete":team_complete,
"cohesiveness_score":cohesiveness_score[0],
"users":cohesiveness_score[1],
"user_dist":cohesiveness_score[2],
"info_dist":info_dist,
"motiv_dist": motiv_dist,
"action_dist":action_dist,
"behav_dist":behav_dist,
"complete_label":complete_label,
"info_label":processing_information_label,
"motivation_label": motivation_label,
"action_label":action_label,
"behav_label":other_data_label,
}
return Response(data)
Your url reverse looks fine. The problem is that you don't set project to your context in ProjectDetailView:
def get_context_data(self, **kwargs):
context = super(ProjectDetailView, self).get_context_data(**kwargs)
try:
project = Project.objects.get(id=self.kwargs['pk1'])
team_name = project.team_id.members.all()
context['team_name'] = team_name
context['project'] = project
except AttributeError:
pass
return context

Comparing date field in a form with current date

I am trying to check with an if statement if the date entered in a form is before the current date. If so write to an object in the model. I am also not sure if there are a better way of doing this.
I get this error
'<' not supported between instances of 'DateField' and 'datetime.date'
My view:
class ActionCreateView(LoginRequiredMixin, generic.CreateView):
login_url = '/scrty/login/'
template_name = "nodiso/actioncreate.html"
form_class = forms.LeadActionCreateForm
# success_url = reverse_lazy('nodisoapp:leaddetail', kwargs['pk'] )
def get_success_url(self, **kwargs):
return reverse("nodisoapp:leaddetail", kwargs={'pk':
self.kwargs['pk']})
def form_valid(self, form):
if form.fields['Duedate'] < datetime.date.today():
self.object.overdue = 1
else:
pass
self.object = form.save(commit=False)
self.object.lead_id = self.kwargs['pk']
self.object.creator = self.request.user.firstname
self.object.save()
return super(ActionCreateView, self).form_valid(form)
The Model:
class LeadActions(models.Model):
lead = models.ForeignKey(Leads)
name = models.CharField(max_length=265)
crdate = models.DateField(auto_now_add=True)
Duedate = models.DateField()
creator = models.CharField(max_length=265)
overdue = models.IntegerField(null=True,blank=True)
def __str__(self):
return self.name
The form:
class LeadActionCreateForm(forms.ModelForm):
class Meta:
model = models.LeadActions
fields = ['name','Duedate']
Since you already pull out the unsaved model from the form here:
self.object = form.save(commit=False)
Why not read the Duedate directly from the model instance, and set the overdue flag accordingly ?
is_overdue = self.object.Duedate > datetime.date.today()
self.object.overdue = 1 if is_overdue else None
Complete code:
class ActionCreateView(LoginRequiredMixin, generic.CreateView):
login_url = '/scrty/login/'
template_name = "nodiso/actioncreate.html"
form_class = forms.LeadActionCreateForm
# success_url = reverse_lazy('nodisoapp:leaddetail', kwargs['pk'] )
def get_success_url(self, **kwargs):
return reverse("nodisoapp:leaddetail", kwargs={'pk': self.kwargs['pk']})
def form_valid(self, form):
self.object = form.save(commit=False)
is_overdue = self.object.Duedate > datetime.date.today()
self.object.overdue = 1 if is_overdue else None
self.object.lead_id = self.kwargs['pk']
self.object.creator = self.request.user.firstname
self.object.save()
return super(ActionCreateView, self).form_valid(form)

IntegrityError with a foreignKey

i have these models, states and cities,
class State(models.Model):
name = models.CharField(max_length=255)
shortname = models.CharField(max_length=100)
def __unicode__(self):
return self.name
class City(models.Model):
name = models.CharField(max_length=255)
state = models.ForeignKey(State)
def __unicode__(self):
return self.name
and im getting a "IntegrityError (1048, "Column 'state_id' cannot be null")" when i save the form, the weird thing is that the state are created, this is what im doing
def form_valid(self, form):
city = form.cleaned_data['city_name']
state = form.cleaned_data['state_name']
m = State.objects.get_or_create(name=state)
state_id = m[0].id
City.objects.get_or_create(name=state, id=state_id)
form.save()
what can i do?
class StoreForm(ModelForm):
class Meta:
model = Store
fields = '__all__'
class StoreGoogleMapForm(StoreForm):
city_name = forms.CharField(
widget=forms.TextInput(
attrs={'readonly': 'readonly'}
)
)
state_name = forms.CharField(
widget=forms.TextInput(
attrs={'readonly': 'readonly'}
)
)
class Meta(StoreForm.Meta):
exclude = (
'state', 'city'
)
widgets = {
'retailer': forms.HiddenInput(),
'lon': forms.HiddenInput(),
'lat': forms.HiddenInput(),
}
def clean(self):
cleaned_data = super(StoreGoogleMapForm, self).clean()
city_name = cleaned_data.get("city_name")
state_name = cleaned_data.get("state_name")
return cleaned_data
class NewStore(LoginRequiredMixin, CreateView):
model = Store
template_name = "new_store.html"
form_class = StoreGoogleMapForm
def get_context_data(self, **kwargs):
ctx = super(NewStore, self).get_context_data(**kwargs)
ctx['cobrand'] = self.retailer
return ctx
def get(self, request, *args, **kwargs):
self.retailer = get_object_or_404(Cobrand, pk=kwargs['pk'])
self.object = Store(retailer=self.retailer)
form_class = self.get_form_class()
form = self.get_form(form_class)
return self.render_to_response(self.get_context_data(form=form))
def form_valid(self, form):
city = form.cleaned_data['city_name']
state = form.cleaned_data['state_name']
m = State.objects.get_or_create(name=state)
City.objects.get_or_create(name=city, state=m[0])
form.save()
messages.add_message(
self.request,
messages.SUCCESS,
'The store was successfuly created!',
extra_tags='success'
)
return HttpResponseRedirect(self.get_success_url())
def get_success_url(self):
return reverse_lazy('store_list', kwargs={'pk': self.kwargs['pk']})
def post(self, request, *args, **kwargs):
self.retailer = get_object_or_404(Cobrand, pk=kwargs['pk'])
self.object = Store(retailer=self.retailer)
form_class = self.get_form_class()
form = self.get_form(form_class)
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
fix the line as
City.objects.get_or_create(name=city, state=m[0])
you don't need form.save().
Anyway this code is a bit strange, what about your Form?
get_or_create returns two parameters https://docs.djangoproject.com/en/1.7/ref/models/querysets/#django.db.models.query.QuerySet.get_or_create and you can then pass the object straight into the next statement.
state, created = State.objects.get_or_create(name=state)
City.objects.get_or_create(name=state, state=state)
suspect you shouldn't be doing this in form_valid but without rest of your code, can't be sure.

Class Based Generic UpdateView inline

I have the following models
class Cv(models.Model):
name = models.CharField(_('name'), max_length=250)
objective = models.CharField(_('objective'), max_length=250)
slug = models.SlugField(editable=False)
class Position(models.Model):
cv = models.ForeignKey(Cv, verbose_name=_('cv'))
start = models.DateField(_('start'))
end = models.DateField(_('end'))
name = models.CharField(_('name'), max_length=250)
currently_employed = models.BooleanField(_('currently employed'))
sector = models.IntegerField(_('sector'), choices=SECTOR_CHOICES)
duties = models.TextField(_('duties'))
and the following forms:
class CvForm(ModelForm):
class Meta:
model = Cv
class PositionForm(ModelForm):
class Meta:
model = Position
widgets = {
'start': DateInput(attrs={'class':'datepicker'}),
'end': DateInput(attrs={'class':'datepicker'}),
}
PositionFormSet = inlineformset_factory(Cv, Position, form=PositionForm, extra=1)
I have created the following Generic CreateView which works great:
class CreateCvView(CreateView):
model = Cv
form_class = CvForm
template_name = 'recruitment/cv/cv_detail.html'
def get_success_url(self):
self.success_url = '/'
return self.success_url
def get_context_data(self, **kwargs):
context = super(CreateCvView, self).get_context_data(**kwargs)
if self.request.POST:
context['position_form'] = PositionFormSet(self.request.POST)
else:
context['position_form'] = PositionFormSet(instance=self.object)
return context
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.slug = slugify(self.request.user)
context = self.get_context_data()
position_form = context['position_form']
if position_form.is_valid():
self.object = form.save()
position_form.instance = self.object
position_form.save()
return HttpResponseRedirect(self.get_success_url())
else:
return self.render_to_response(self.get_context_data(form=form))
What I want to do is an UpdateView and so I copied the createview and passed it the slug as follows:
class EditCvView(UpdateView):
model = Cv
form_class = CvForm
template_name = 'recruitment/cv/cv_detail.html'
def get_success_url(self):
self.success_url = '/'
return self.success_url
def get_context_data(self, **kwargs):
context = super(EditCvView, self).get_context_data(**kwargs)
if self.request.POST:
context['position_form'] = PositionFormSet(self.request.POST)
else:
context['position_form'] = PositionFormSet(instance=self.object)
return context
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.slug = slugify(self.request.user)
context = self.get_context_data()
position_form = context['position_form']
if position_form.is_valid():
self.object = form.save()
position_form.instance = self.object
position_form.save()
return HttpResponseRedirect(self.get_success_url())
else:
return self.render_to_response(self.get_context_data(form=form))
It loads fine but when I post the form I get a 'list index out of range' error on PositionFormSet(self.request.POST) in get_context_data. Has anyone else had this problem?
in EditCvView:
context['position_form'] = PositionFormSet(self.request.POST, instance=self.object)