我的问题是我无法保存表单。我认为问题在于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 %}
答案 0 :(得分:0)
您在此处所做的是插入经过验证的数据。而不是那样,
使用请求POST数据初始化表单,其中应包括&#34; event&#34;密钥及其从kwargs [&#39; pk&#39;]获得的价值。然后验证并保存。您将不会收到验证错误,并且将保存该值。
基本上,即使您从必须验证的网址获取的事件ID也是如此。 Django对你调用is_valid时传递的pk值进行数据库级别检查。