[英]Saving Django form data to a User
我正在創建一個用於一般教育用途的網站,其中一項功能是日歷部分,我希望用戶能夠在其中存儲他們的事件,但是當他們登錄時,他們可以查看他們創建的事件。 這是一個學術任務。
我似乎無法將此日歷鏈接到用戶字段。 我希望日歷表中的每條記錄都有一個與 current_user 相同的 user_id。 我知道您可以使用 django 默認用戶身份驗證,但由於不知道它,我還沒有這樣做,當我意識到為時已晚。
所以我真正需要做的就是當表單有效時,我需要將 current_user id 的值分配為日歷表中學生的值。 但出於某種原因,我不斷遇到問題,並且未檢測到表單有效或程序未分配值。
我的主要目標是讓每個用戶查看他們自己的日歷。 我不介意將當前的學生字段更改為外鍵字段
學生.意見
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})
學生模型
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)
學生表格
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)
使用視圖呈現此表單集以供學生創建他們的事件,該表單集自動將學生的事件關聯到日歷。
所以你可以添加你的邏輯來做更多的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.