Python Django createView将当前用户id传递给Modelform
我正在尝试制作一个日历应用程序,目前正在尝试阻止人们在这段时间内已经很忙的时候保存活动。我认为我的问题是modelForm没有用户id作为form对象的一部分。如何传递用户_id,以便使用clean()进行过滤 我尝试使用get_form_kwargs(),但这似乎不是正确的方法 请你给我指一下正确的方向怎么做 view.pyPython Django createView将当前用户id传递给Modelform,python,django,Python,Django,我正在尝试制作一个日历应用程序,目前正在尝试阻止人们在这段时间内已经很忙的时候保存活动。我认为我的问题是modelForm没有用户id作为form对象的一部分。如何传递用户_id,以便使用clean()进行过滤 我尝试使用get_form_kwargs(),但这似乎不是正确的方法 请你给我指一下正确的方向怎么做 view.py class CalendarEventAdd(LoginRequiredMixin, CreateView): model = Event form_cl
class CalendarEventAdd(LoginRequiredMixin, CreateView):
model = Event
form_class = EventForm
template_name = 'calendar_create_event_form.html'
success_url = reverse_lazy('calendar_list')
def form_valid(self, form):
form.instance.manage = self.request.user
return super(CalendarEventAdd, self).form_valid(form)
def get_form_kwargs(self, *args, **kwargs):
kwargs = super(CalendarEventAdd, self).get_form_kwargs()
kwargs['user_id'] = self.request.user
return kwargs
form.py
class EventForm(forms.ModelForm):
class Meta:
model = Event
widgets = {
'start_time': DateInput(attrs={'type': 'datetime-local'}, format='%Y-%m-%dT%H:%M'),
'end_time': DateInput(attrs={'type': 'datetime-local'}, format='%Y-%m-%dT%H:%M'),
}
fields = ['avilibility','start_time','end_time']
def __init__(self, *args, **kwargs):
super(EventForm, self).__init__(*args, **kwargs)
# input_formats parses HTML5 datetime-local input to datetime field
self.fields['start_time'].input_formats = ('%Y-%m-%dT%H:%M',)
self.fields['end_time'].input_formats = ('%Y-%m-%dT%H:%M',)
def clean(self, *args, **kwargs):
form_start_time = self.cleaned_data.get('start_time')
form_end_time = self.cleaned_data.get('end_time')
form_manage_id = self.cleaned_data.get('manage_id')
between = Event.objects.filter(manage_id=1, end_time__gte=form_start_time, start_time__lte=form_end_time)
if between:
raise forms.ValidationError('Already Calendar entry for this time')
super().clean()
model.py
class Event(models.Model):
avilibility_choices = [
('Avilible', 'Avilible'),
('Busy', 'Busy'),
]
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
manage = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
avilibility = models.CharField(max_length=10, choices=avilibility_choices, editable=True)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
def __str__(self):
return self.avilibility + " - " + str(self.start_time) + " - " + str(self.end_time) + " - " +str(self.id)
def get_absolute_url(self):
return reverse('calendar_event_detail', args=[str(self.id)])
def get_absolute_url_edit(self):
return reverse('calendar_event_detail_update', args=[str(self.id)])
def get_html_url(self):
url = reverse('event_edit', args=(self.id,))
return f'<a href="{url}"> {self.avilibility} </a>'
类事件(models.Model):
适航性_选项=[
('Avilible','Avilible'),
(‘忙’、‘忙’),
]
id=models.UUIDField(主键=True,默认值=uuid.uuid4,可编辑=False)
manage=models.ForeignKey(在_delete=models.CASCADE上获取_user_model())
Avibility=models.CharField(最大长度=10,选项=Avibility\u选项,可编辑=True)
开始时间=models.DateTimeField()
end_time=models.DateTimeField()
定义(自我):
返回self.avibility+“-”+str(self.start\u time)+“-”+str(self.end\u time)+“-”+str(self.id)
def get_绝对_url(自身):
返回反向('calendar\u event\u detail',args=[str(self.id)])
def get_绝对值_url_编辑(自我):
返回反向('calendar\u event\u detail\u update',args=[str(self.id)])
def get_html_url(自我):
url=reverse('event_edit',args=(self.id,))
返回f“”
在您的视图中,您应该传递用户的主键,因此:
def get_form_kwargs(self, *args, **kwargs):
kwargs = super(CalendarEventAdd, self).get_form_kwargs()
kwargs['user_id'] = self.request.user.pk
return kwargs
如果您以后决定使用EventForm
不仅创建而且更新事件
对象,则.exclude(pk=self.instance.pk)
将排除您正在编辑的对象
注意:建议 使用上面的 . 这更安全,因为如果身份验证应用程序尚未加载,则设置 仍然可以指定模型的名称。因此,最好写下:
from django.conf import settings
class Event(models.Model):
# …
manage = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
来自django.conf导入设置的
类事件(models.Model):
# …
manage=models.ForeignKey(
settings.AUTH\u用户\u模型,
on_delete=models.CASCADE
)
from django.conf import settings
class Event(models.Model):
# …
manage = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)