我正在创建一个用于普通教育用途的网站,其中一个功能是日历部分,我希望用户能够存储他们的活动,但是当他们登录时,他们可以查看他们创建的事件。这是一个学术任务。
我似乎无法将此日历链接到用户字段。我希望日历表中的每条记录都有一个user_id,它与current_user相同。我知道你可以使用django默认用户auth,但我没有这样做,因为我不知道它,当我意识到它为时已晚。
所以我真正需要做的是当表单有效时,我需要将current_user id的值指定为日历表中student的值。但由于某种原因,我不断遇到问题,并且表单未被检测为有效或程序只是没有分配值。
我的主要目标是让每个用户查看自己的日历。我不介意将当前学生字段更改为外键字段
Student.Views
def calendar(request):
student_obj = Student.objects.get(student_name=current_user)
print(student_obj)
if request.method == 'POST':
form = EventsForm(initial={'student': '3'} or request.POST)
print(form.errors)
if form.is_valid():
form.save()
all_events = Events.objects.filter(student=student_obj.id)
messages.success(request, 'Event Has Been Added')
return render(request, 'Student/calendar.html', {'all_events': all_events})
else:
messages.success(request, 'Event Has NOT Been Added')
all_events = Events.objects.filter(student=student_obj.id)
return render(request, 'Student/calendar.html', {'all_events': all_events})
Student.Models
class Student(models.Model):
student_name = models.CharField(max_length=59, default=None)
username = models.CharField(max_length=59)
password = models.CharField(max_length=59)
age = models.PositiveIntegerField()
date_of_birth = models.DateField(max_length=10)
form = models.CharField(max_length=3)
email = models.EmailField(max_length=59)
present = models.PositiveIntegerField(default=0)
late = models.PositiveIntegerField(default=0)
absent = models.PositiveIntegerField(default=0)
maths_grade = models.PositiveIntegerField(default=0)
english_grade = models.PositiveIntegerField(default=0)
science_grade = models.PositiveIntegerField(default=0)
behaviour_level = models.PositiveIntegerField(default=0)
def __str__(self):
return self.student_name
class Events(models.Model):
student = models.CharField(max_length=200)
date = models.DateField(max_length=10, default=None)
event = models.CharField(max_length=200)
completed = models.BooleanField(default=False)
Student.forms
class EventsForm(forms.ModelForm):
class Meta:
model = Events
fields = ["event", "completed", "date", "student"]
日历模板
<div class="container" style="color: #fff">
<br/>
{% if messages %}
{% for message in messages %}
<div class="alert alert-warning alert-dismissible" roles="alert">
<button class="close" data-dismiss="alert">
<small>x</small>
</button>
{{ message }}
</div>
{% endfor %}
{% endif %}
{% if all_events %}
<div>
<table class="table table-dark table-bordered">
{% for things in all_events %}
{% if things.completed %}
<style>
.striker {
text-decoration: line-through;
text-color: black;
}
</style>
<tr class="table-danger striker">
<td style="color: black">{{ things.date }}</td>
<td><a href="{% url 'edit' things.id %}", style="color: black">{{ things.event }}</a></td>
<td><center><a href="{% url 'delete' things.id %}", style="color: black">Delete</a></center></td>
</tr>
{% else %}
<tr>
<td>{{ things.date }}</td>
<td ><a href="{% url 'edit' things.id %}", style="color: white">{{ things.event }}</a></td>
<td><center><a href="{% url 'delete' things.id %}", style="color: white">Delete</a></center></td>
</tr>
{% endif %}
{% endfor %}
</table>
</div>
{% endif %}
将form.save()更改为
event = form.save(commit=False)
event.student = request.user
event.save()
那就行了。
不要让它变得复杂,这必须更容易。如果我明白你想做什么,我会创建我的模型如下:
在这里更新
#model.py
from django.db.models.signals import post_save
from django.dispatch import receiver
class Student(models.Model):
user= models.OneToOneField(User, null=True) #student is user
#Define student fields...
class Calendar(models.Model):
#Defile calender fields here along with its default values ...
user = models.OneToOneField(Student)
'''
this signal populate calender table with user_id along with its
calender fields
'''
@receiver(post_save, sender=Student)
def create_student_calender(sender, instance, created, **kwargs):
if created and not kwargs.get('raw', False):
calendar = Calender(user=instance)
calendar.save()
class Event(models.Model):
calender = models.ForeignKey(Callender, null=True)
# Define event fields here ...
使用这样的模型结构,每当学生创建帐户时,将使用日历字段和学生的id字段保存日历模型。
那么学生如何创建他们的活动?只需创建一个inlineformset_factory表单,就可以在每个学生的日历上创建事件,如下所示:
#form.py
from django.forms import inlineformset_factory
from django import forms
class EventForm(forms.ModelForm):
#Events form fields here...
class Meta:
model = Event
fields = ["Event's field"]
EventFormSet = inlineformset_factory(Calender, Event, form=EventForm,
max_num=1, can_delete=False)
渲染此formset以及学生创建其事件的视图,formset自动将学生的事件与日历相关联。
所以你可以添加你的逻辑来做更多。
我希望你明白你应该怎么做来存档这个问题