Формы Django хотят автоматически сохранять пользователя, клиента и дату и время

Мне нужна помощь.

В моих моделях.py у меня есть таблица для Note. Что я хочу сделать с этой таблицей, так это создать форму, в которой пользователь может вводить некоторые заметки в текстовое поле для конкретного клиента.

models.py

class Note(models.Model):
    client = models.ForeignKey(Client)
    datetime = models.DateTimeField(default=datetime.now)
    user  = models.ForeignKey(User)
    note = models.TextField()

    def __unicode__(self):
        return unicode(self.user)

Теперь, когда пользователь вводит примечание, он должен только видеть текстовое поле примечания. После того, как форма была отправлена, форма должна автоматически сохранять дату и время в любое время и дату. У меня, кажется, с полем пользователя. После отправки формы аутентифицированный пользователь должен быть автоматически сохранен. Я не совсем уверен, как вы можете это сделать. Я также хочу автоматически сохранять клиента, поэтому, на какую бы страницу клиента вы ни попали (r'^clients/(?P<client_id>\d+)/$', views.get_client), автоматически сохраняйтесь с этого клиента.

Вот что я написал в своих form.py

forms.py

class NoteForm(forms.ModelForm):
    class Meta:
        model = models.Note
        exclude = ('client','user','datetime')

И здесь тоже мои взгляды.

Views.py

def add_notes(request, client_id):
    client = models.Client.objects.get(pk = client_id)
    notes = client.note_set.all()
    if request.method == 'POST':
        form = forms.NoteForm(request.POST)
        if form.is_valid():
            form.save(True)
            request.user.message_set.create(message = "Note is successfully added.")
            return HttpResponse("<script language=\"javascript\" type=\"text/javascript\">window.opener.location = window.opener.location; window.close();</script>")
    else:
        form = forms.NoteForm()
    return render_to_response('note_form.html', {'form':form, 'client':client,'notes':notes}, context_instance = RequestContext(request))

person Shehzad009    schedule 20.06.2011    source источник


Ответы (3)


class NoteForm(forms.ModelForm):
    class Meta:
        model = models.Note
        exclude = ('client','user','datetime')

    def __init__(self, client, user, *args, **kwargs):
        self.client = client
        self.user = user
        super(NoteForm, self).__init__(*args, **kwargs)

    def save(self):
        note = super(NoteForm, self).save(commit=False)
        note.user = self.user
        note.client = self.client
        note.save()
        return note

И на виду:

form = forms.NoteForm(client, request.user, request.POST)
person DrTyrsa    schedule 20.06.2011
comment
Лучший ответ IMO, этот код лучше всего подходит для самой формы модели, поэтому переопределение .save() может быть переработано вместо того, чтобы вводить его в каждом представлении позже. - person Omar Gonzalez; 31.12.2017

Во-первых, для ваших моделей:

datetime = models.DateTimeField(auto_now=True)

это лучше.

Для вашего взгляда сейчас, я думаю, вы должны написать:

note = Note(client=client, user=request.user)
form = forms.NoteForm(instance=note)
person nicolas    schedule 20.06.2011
comment
Почему auto_now_add лучше? - person DrTyrsa; 20.06.2011
comment
auto_now_add и auto_now делают поля недоступными для редактирования, если один из этих атрибутов имеет значение True. Просто читабельнее. - person nicolas; 26.09.2011

person    schedule
comment
Хотя все эти ответы могут быть правильными, победитель может быть только один. Метод Дэниелса кажется лучшим методом для решения этой проблемы. - person Shehzad009; 20.06.2011
comment
@ Shehzad009 Shehzad009 Я согласен, что Даниэль предоставил лучший ответ, но я совершенно уверен, что этот код должен быть в форме, а не на виду. - person DrTyrsa; 20.06.2011