首页 > 解决方案 > 如何在 django 表单中添加自定义方法

问题描述

我是 django 的新手,我正在创建一个假期应用程序。我希望能够在创建新行程时,创建行程的用户成为该行程的成员。

这是我的models.py文件:

class Trip(models.Model):
    trip_name = models.CharField(max_length=255,unique=False)
    start_date = models.DateField(default=datetime.date.today)
    end_date = models.DateField(default=datetime.date.today)
    slug = models.SlugField(allow_unicode=True,unique=True)
    members = models.ManyToManyField(User,through='TripMember')


def __str__(self):
    return self.trip_name

def save(self,*args,**kwargs):
    self.slug = slugify(self.trip_name)
    super().save(*args,**kwargs)

def get_absolute_url(self):
    return reverse('trips:single',kwargs={'slug':self.slug})

class Meta:
    ordering = ['start_date']


class TripMember(models.Model):
    trip = models.ForeignKey(Trip,null=True,related_name='memberships',on_delete=models.SET_NULL)
    user = models.ForeignKey(User,null=True,related_name='user_trips',on_delete=models.SET_NULL)

def __str__(self):
    return self.user.username

class Meta:
    unique_together = ('trip','user')

这是我的forms.py文件:

class TripCreateForm(forms.ModelForm):
    class Meta:
        fields = ('trip_name','start_date','end_date')
        model = Trip

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["trip_name"].label = "Trip Name"
        self.fields["start_date"].label = "Start Date"
        self.fields["end_date"].label = "End Date"

这是我的views.py文件:

class CreateTrip(CreateView):
    form_class = TripCreateForm
    template_name = 'trips/trip_form.html'

和我的trip_form.html页面:

<form action="{% url 'trips:create' %}" method="post" id='tripForm'>
    {% csrf_token %}
    {% bootstrap_form form %}
    <input type="submit" class="btn btn-primary btn-large" value="Create">
</form>

我将把用户设置为旅行会员的代码放在哪里?为什么?另外,如果有更好的设置方法,请告诉我!我打算把它放在模型的保存部分,但我不太确定这是否正确。谢谢!

标签: pythondjangodjango-modelsdjango-viewsdjango-forms

解决方案


您可以在视图中覆盖类的form_valid()方法:CreateTrip

def form_valid(self, form):
    """If the form is valid, save the associated model."""
    self.object = form.save()

    # add the current user to the members list of the trip
    user = self.request.user
    self.object.members.add(user)

    return super().form_valid(form)

推荐阅读