dhooonk
dhooonk

Reputation: 2625

How can I throw pk to forms.py django

moneylog get relation with moneybook, and when i create moneylog, I wanna moneybook of moneylog choose default=moneybook.pk

and these are my codes.

moneylog/model.py

moneybook = models.ForeignKey(
    moneybook_models.Moneybook, on_delete=models.CASCADE)

moneylogs/urls.py

app_name = "moneylogs"

urlpatterns = [
    path("create/<int:pk>/", views.moneylog_create.as_view(), name="create"),

moneybooks/detail.html

<a style="display:scroll;position:fixed;bottom:50px;right:30px;" href="{% url 'moneylogs:create' pk %}">
        <div class="rounded-full h-16 w-16 flex items-center justify-center bg-red-400 text-bold font-bold text-white">+</div>
    </a> 

so if i click the + button, then

moneylogs/views.py

class moneylog_create(FormView):

    form_class = forms.CreateMoneylogForm
    template_name = "moneylogs/create.html"

    def form_valid(self, form):
        moneylog = form.save()
        moneylog.save()
        return redirect(reverse("cores:home"))

moneylog/forms.py

class CreateMoneylogForm(forms.ModelForm):
    class Meta:
        model = models.Moneylog
        form.fields['moneybook'].initial = moneybook_models.Moneybook.objects.get(
            pk=pk)
        fields = (
            "pay_day",
            "payer",
            "dutch_payer",
            "price",
            "category",
            "memo",
        )
        widgets = {
            "dutch_payer": forms.CheckboxSelectMultiple
        }

    def save(self, *args, **kwargs):
        moneylog = super().save(commit=False)
        return moneylog

but it doesn't work. as you see.. how can i transfer moneybook.pk to moneylogs forms.py? or how can achieve moneybook belongs to moneybook default?

Upvotes: 0

Views: 45

Answers (1)

neverwalkaloner
neverwalkaloner

Reputation: 47364

You don't need to pass moneybook obect to the form. Instead you can set it on view level:

class moneylog_create(FormView):

    form_class = forms.CreateMoneylogForm
    template_name = "moneylogs/create.html"

    def form_valid(self, form):
        moneybook = Moneybook.objects.get(pk=self.kwargs["pk"]
        form.instance.moneybook = moneybook
        return super().form_valid(form)

Upvotes: 2

Related Questions