Created ProgrammingLanguageInlineFormSet

Users can now save multiple project programming languages at the same time
This commit is contained in:
Kristofers Solo 2023-06-29 10:44:55 +00:00
parent b23421702f
commit ccee378045
2 changed files with 55 additions and 33 deletions

View File

@ -1,4 +1,5 @@
from django import forms from django import forms
from django.forms import inlineformset_factory
from .models import HostingPlatform, ProgrammingLanguage, Project, ProjectHostingPlatform, ProjectProgrammingLanguage from .models import HostingPlatform, ProgrammingLanguage, Project, ProjectHostingPlatform, ProjectProgrammingLanguage
@ -61,7 +62,19 @@ class ProjectForm(forms.ModelForm):
"placeholder": "Description", "placeholder": "Description",
} }
), ),
"license": forms.CheckboxSelectMultiple(), # "license": forms.CheckboxSelectMultiple(),
"tag": forms.CheckboxSelectMultiple(), # "tag": forms.CheckboxSelectMultiple(),
"operating_system": forms.CheckboxSelectMultiple(), # "operating_system": forms.CheckboxSelectMultiple(),
} }
ProgrammingLanguageInlineFormSet = inlineformset_factory(
Project,
ProjectProgrammingLanguage,
fields=(
"programming_language",
"percentage",
),
extra=1,
can_delete=True,
)

View File

@ -1,5 +1,4 @@
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.forms import inlineformset_factory
from django.shortcuts import redirect from django.shortcuts import redirect
from django.views.generic import CreateView, DeleteView, DetailView, UpdateView from django.views.generic import CreateView, DeleteView, DetailView, UpdateView
@ -7,15 +6,8 @@ from django_filters.views import FilterView
from .filters import ProjectFilter from .filters import ProjectFilter
from .forms import HostingPlatformForm, ProgrammingLanguageForm, ProjectForm from .forms import HostingPlatformForm, ProgrammingLanguageInlineFormSet, ProjectForm
from .models import Project, ProjectProgrammingLanguage from .models import Project
ProgrammingLanguageInlineFormset = inlineformset_factory(
Project,
ProjectProgrammingLanguage,
form=ProgrammingLanguageForm,
extra=1,
)
class ProjectListView(FilterView): class ProjectListView(FilterView):
@ -35,30 +27,29 @@ class ProjectCreateView(LoginRequiredMixin, CreateView):
def get_context_data(self, *args, **kwargs): def get_context_data(self, *args, **kwargs):
data = super().get_context_data(**kwargs) data = super().get_context_data(**kwargs)
data["hosting_platform"] = HostingPlatformForm(self.request.POST or None, prefix="hosting") data["hosting_platform"] = HostingPlatformForm(self.request.POST or None)
data["programming_language"] = ProgrammingLanguageInlineFormset(self.request.POST or None, prefix="language") data["programming_languages"] = ProgrammingLanguageInlineFormSet(self.request.POST or None)
data["empty_form"] = ProgrammingLanguageInlineFormset(prefix="language_empty")
return data return data
def form_valid(self, form): def form_valid(self, form):
context = self.get_context_data() context = self.get_context_data()
form.instance.owner = self.request.user form.instance.owner = self.request.user
self.object = form.save() # Save project form
hosting_platform = context["hosting_platform"] hosting_platform = context["hosting_platform"]
programming_language = context["programming_language"]
self.object = form.save()
if hosting_platform.is_valid(): if hosting_platform.is_valid():
hosting_platform.instance.project = self.object hosting_platform = hosting_platform.save(commit=False)
hosting_platform.project = self.object
hosting_platform.save() hosting_platform.save()
# TODO: allow adding multiple languages
if programming_language.is_valid(): programming_languages = context["programming_languages"]
for instance in programming_language.save(commit=False): if programming_languages.is_valid():
instance.project = self.object programming_languages.instance = self.object
instance.save() programming_languages.save()
programming_language.save_m2m()
if hosting_platform.is_valid() and programming_language.is_valid(): return super().form_valid(form)
return super().form_valid(form)
else:
return self.render_to_response(self.get_context_data(form=form))
class ProjectDetailView(DetailView): class ProjectDetailView(DetailView):
@ -85,12 +76,30 @@ class ProjectUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
return redirect("login") return redirect("login")
def get_context_data(self, *args, **kwargs): def get_context_data(self, *args, **kwargs):
data = super(ProjectUpdateView, self).get_context_data(**kwargs) data = super().get_context_data(**kwargs)
data["hosting_platform"] = HostingPlatformForm(self.request.POST or None, instance=self.object.projecthostingplatform, prefix="hosting") data["hosting_platform"] = HostingPlatformForm(self.request.POST or None, instance=self.object.projecthostingplatform)
data["programming_language"] = ProgrammingLanguageInlineFormset(self.request.POST or None, instance=self.object, prefix="language") data["programming_languages"] = ProgrammingLanguageInlineFormSet(self.request.POST or None, instance=self.object)
data["empty_form"] = ProgrammingLanguageInlineFormset(prefix="language_empty")
return data return data
def form_valid(self, form):
context = self.get_context_data()
form.instance.owner = self.request.user
self.object = form.save() # Save project form
hosting_platform = context["hosting_platform"]
if hosting_platform.is_valid():
hosting_platform.project = self.object
hosting_platform.save()
programming_languages = context["programming_languages"]
if programming_languages.is_valid():
programming_languages.instance = self.object
programming_languages.save()
return super().form_valid(form)
class ProjectDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView): class ProjectDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Project model = Project