尝试使用字段ManyToMany传递表单中的初始数据

时间:2018-01-11 12:08:15

标签: python django forms modelform

我的问题是我无法保存表单。我认为问题在于event模型中的Register字段。 我不希望用户从列表中选择一个事件,我希望它自动发生,因此代码:form.cleaned_data['event'] = kwargs['pk'] 代码kwargs['pk']的这部分来自网址。

如果这是处理表格和暗示解决我的问题的好方法,请提出任何提示。以下是我的代码。

谢谢:)

型号:

class Event(models.Model):
    title = models.CharField(max_length=500)
    date = models.DateField()
    text = models.TextField()
    image = FilerImageField(null=True, blank=True)
    flag = models.ForeignKey(Flag)
    free_places = models.IntegerField()

    class Meta:
        ordering = ['-date']

    def __str__(self):
        return self.title

    @property
    def slug(self):
        return slugify(self.title)

    def get_absolute_url(self):
        return reverse('events:detail', args=[self.slug, self.id])


class Register(models.Model):
    event = models.ForeignKey(Event)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    company = models.CharField(max_length=30, blank=True)
    street = models.CharField(max_length=50, blank=True)
    post_code = models.CharField(max_length=30, blank=True)
    city = models.CharField(max_length=30, blank=True)
    email = models.EmailField()
    phone_number = models.IntegerField()

    def __str__(self):
        return self.first_name

    def get_event_name(self):
        return self.event

查看:

class EventDetailView(DetailView, ModelFormMixin):
    model = models.Event
    form_class = forms.RegisterForm

    def get_success_url(self):
        return reverse('events:list')

    def post(self, request, *args, **kwargs):
        form = self.get_form()
        print(kwargs['pk'])
        print(self.form_class)
        if form.is_valid():
            print(form.cleaned_data['event'])
            form.cleaned_data['event'] = kwargs['pk']
            form.save()
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

我的表格:

class RegisterForm(ModelForm):
    class Meta:
        model = models.Register
        fields = ('event', 'first_name', 'last_name', 'company', 'street', 'post_code', 'city', 'email', 'phone_number',)

我的模板:

{% extends 'base.html' %}

{% block content %}
    <ul>
        <h1>Detail page:</h1>
        <li>{{ object.title }}</li>
        <li>{{ object.text }}</li>
        <li>{{ object.date }}</li>
    </ul>

    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Submit" />
    </form>

{% endblock content %}

1 个答案:

答案 0 :(得分:0)

您在此处所做的是插入经过验证的数据。而不是那样,

使用请求POST数据初始化表单,其中应包括&#34; event&#34;密钥及其从kwargs [&#39; pk&#39;]获得的价值。然后验证并保存。您将不会收到验证错误,并且将保存该值。

基本上,即使您从必须验证的网址获取的事件ID也是如此。 Django对你调用is_valid时传递的pk值进行数据库级别检查。