繁体   English   中英

在 django 中创建 model 实例

[英]Creating model instance in django

一般任务:有一个显示在表格视图中的事件列表,用户单击事件并被重定向到单个事件页面,该页面显示有关事件的额外信息。

此模板上有一个按钮,该按钮应提供在用户选择的事件列表中记录事件的一些数据的功能。

而且我真的不明白如何将事件数据传递到表单中以创建 user_event,也许我选择了错误的方式来创建 model 的实例?

模型.py


class Event(models.Model):
    LANGUAGE_CHOICES = [
        ('EN', 'English'), ('IT', 'Italian'), ('FR', 'French'), ('DE', 'German'), ('RU', 'Russian'), ]
    STATUS_CHOICES = [('draft', 'Draft'), ('confirmed', 'Confirmed'), ]
    FORMAT_CHOICES = [('live', 'Live'), ('online', 'Online'), ]
    TOPIC_CHOICES = [('cataract', 'Cataract'),
                     ('vitreo', 'Vitreoretinal'),
                     ('optometry', 'Optometry'),
                     ('multi', 'Multidisciplinary'),
                     ('plastic', 'Plastic and Reconstructive surgery'),
                     ('onco', 'Ocular oncology'),
                     ('glaucoma', 'Glaucoma'),
                     ('pediatrics', 'Pediatrics'), ]
    title = models.CharField(
        max_length=250, verbose_name='Event', db_index=True, default="Event")
    slug = models.SlugField(max_length=250, unique_for_date='publish')
    kol = models.ManyToManyField(
        Kol, verbose_name='Presenter', db_index=True, blank=True)
    body = models.TextField(verbose_name='Description', blank=True)
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    sponsor = models.CharField(
        max_length=150, verbose_name='Sponsored by', default='')
    organizer = models.CharField(
        max_length=150, verbose_name='Organized by', default='')
    topic = models.CharField(
        max_length=100, choices=TOPIC_CHOICES, default='multi', verbose_name='Discipline')
    status = models.CharField(
        max_length=100, choices=STATUS_CHOICES, default='draft')
    event_format = models.CharField(
        max_length=50, choices=FORMAT_CHOICES, default='online', verbose_name='Format', db_index=True)
    main_language = models.CharField(
        max_length=50, choices=LANGUAGE_CHOICES, default='EN', verbose_name='Main language', db_index=True)
    event_url = models.URLField(blank=True)
    event_date_start = models.DateField(
        verbose_name='Start date', db_index=True)
    event_time_start = models.TimeField(default='09:00')
    event_date_finish = models.DateField(
        verbose_name='End date', auto_now=True)
    event_time_finish = models.TimeField(default='18:00')
    is_cme = models.BooleanField(
        default=False, verbose_name='CME credits', db_index=True)

    objects = models.Manager()  # the default manager
    published = PublishedManager()  # published manager
    futured = FutureManager()  # future dates only
    # follow check
    users_follow = models.ManyToManyField(
        settings.AUTH_USER_MODEL, related_name='events_liked', blank=True)

    class Meta:
        ordering = ('event_date_start',)

    def __str__(self):
        return self.title

    def get_kols(self):
        return "\n".join([str(p) for p in self.kol.all()])

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        super(Event, self).save(*args, **kwargs)

    @property
    def _month(self):
        return datetime.date(self.event_date_start).month
    event_month = property(_month)

    def get_absolute_url(self):
        return reverse('events:event_detail', args=[self.publish.year,
                                                    self.publish.strftime(
                                                        '%m'),
                                                    self.publish.strftime(
                                                        '%d'),
                                                    self.slug])


class UserEvent(models.Model):
    follower = models.ForeignKey(
        User, related_name='user_events', on_delete=models.CASCADE)
    my_event = models.ForeignKey(
        Event, related_name='selected_event', on_delete=models.CASCADE)
    title = models.CharField(
        max_length=250, verbose_name='Event', db_index=True, default="Event")
    event_url = models.URLField(blank=True)
    event_date_start = models.DateField(
        verbose_name='Start date')
    event_date_finish = models.DateField(
        verbose_name='End date')

    class Meta:
        ordering = ['-event_date_start']

    def save(self, *args, **kwargs):
        created = not self.pk
        super().save(*args, **kwargs)
        if created:
            UserEvent.objects.create(user=self)

    def __str__(self):
        return self.title

forms.py

class UserEventForm(forms.ModelForm):
    class Meta:
        model = UserEvent
        fields = ("title", "event_url",
                  "event_date_start", "event_date_finish")       

detail.html 带按钮

{% extends 'bbase11.html' %} {% block title %} {{ event.title}} {% endblock %} {% block content %}
<div class="container">
    <h1> {{ event.title }}</h1>
    <p class='event_descr'> {{event.body}}</p>
    <p> Presenting professionals {{event.get_kols}}</p>
    <div>Organized by {{event.organizer}}</div>
    <div>Sponsored by {{event.sponsor}}</div>
    <div> 
    <form action= "{% url "events:add_event" %}" method = "POST" >
    {{form.as_p}}
    {% csrf_token %}
    <input id='event' type='hidden' value = {{event.id}}>
    <button  type="submit" class="btn btn-outline-primary btn-sm m-0 waves-effect">Add to calendar</button></div>
    </form>
</div>
{% endblock %}

视图.py

def event_detail(request, year, month, day, event):
    event = get_object_or_404(Event, slug=event,
                              status='confirmed',
                              publish__year=year,
                              publish__month=month,
                              publish__day=day)

    return render(request, 'events/event/detail.html', {'event': event, 'add_event': add_event})

@login_required
def add_event(request):
    if request.method == 'POST':
        form = UserEventForm(request.POST or None)
        if form.is_valid():
            form.save()
            messages.success(request, ("Event has been added"))
            return redirect('event_list')
        else:
            messages.error(request, ("Event has not been added"))
            return redirect('events:event_list')
    else:
        events = Event.futured.all()
        return render(request, 'list.html', {'events': events})

看起来它可能是详细信息中的 URL 中的错字。带引号的detail.html

改变这个:

<form action= "{% url "events:add_event" %}" method = "POST" >

对此:

<form action="{% url 'events:add_event' %}" method="POST">

使用基于 class 的视图而不是基于 function 的视图,您可以覆盖get_initial方法,如下所示:

class AddEventCreateView(CreateView):
    model = Event
    form_class = UserEventForm
    template_name = 'your/template.html'

    def get_initial(self):
        initial = super().get_initial()
        # Add your initial values here - for example
        initial['title'] = 'Some value'
        return initial

   def form_valid(self, form):
        self.object = form.save(commit=False)

        # Do something here

        return super().form_valid(form)

    def get_success_url(self):
        return reverse_lazy('your:url-name')

您现在可以根据需要向表单传递任意数量的初始值。 有关详细信息,请参阅http://ccbv.co.uk/projects/Django/3.0/django.views.generic.edit/CreateView/#get_initial

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM