#django #view #model
#django #Вид #Модель
Вопрос:
Допустим, у меня есть две модели:
class Thinclient(models.Model):
hostname = models.TextField(_('hostname'),unique=True,
editable=False)
logs = models.ManyToManyField(Log, blank=True, null=True)
class Log(models.Model):
logname = models.TextField(editable=False)
created = models.DateTimeField(auto_now_add=True, editable=False)
Как вы можете видеть, у меня есть тонкие клиенты. Теперь, если один из этих тонких клиентов загружается, он должен отправить POST-запрос в мое приложение с именем тонкого клиента и логином (т. Е. «Загрузка …»).
Теперь мой view выполнит всю работу, и в этом у меня проблема. В настоящее время это выглядит так:
def log(request):
if request.method == 'POST':
form = ThinclientForm(request.POST)
if form.is_valid():
message = form.cleaned_data['logname']
Log.objects.get_or_create(logname=message)
return HttpResponse(content="", mimetype=None, status=200)
else:
return HttpResponse(content="Unsuccessful", mimetype=None,
status=400)
return render_to_response('thin/status', {
'form': form, })
Однако это не сработает, потому что я должен назначить сообщение одному конкретному тонкому клиенту. Я полагаю, мне нужно написать свою собственную форму с именем хоста, logname, и именно здесь у меня возникла проблема, как я могу сохранить свои модели таким образом, чтобы сообщение было присвоено тонкому?
Надеюсь, я мог бы объяснить, что мне нужно знать, если не сказать мне. И спасибо за любую помощь в этом
Комментарии:
1. Название вашего вопроса на немецком языке.
Ответ №1:
Предполагая, что ваше имя Thinclient также включено в сообщение, вы можете просто получить его оттуда и использовать для поиска фактического объекта, а затем назначить ему это сообщение журнала.
log = Log.objects.get_or_create(logname=message)
client = Thinclient.objects.get(hostname=request.POST['clientname']
client.logs.add(log)
(Одно замечание: вы не должны использовать текстовые поля для таких вещей, как имена клиентов — они хранятся в базе данных в виде объектов BLOB / TEXT, что гораздо менее эффективно, чем обычные переменные. Вместо этого используйте CharField.)
Ответ №2:
Здесь есть несколько проблем. Первый заключается в разработке ваших моделей. Ссылка от Log
до ThinClient
должна быть ForeignKey
от Log
до ThinClient
class Thinclient(models.Model):
hostname = models.TextField(_('hostname'),unique=True,
editable=False)
class Log(models.Model):
thin_client = models.ForeignKey(Thinclient)
logname = models.TextField(editable=False)
created = models.DateTimeField(auto_now_add=True, editable=False)
Вам вообще нужна форма здесь? Разве ваши тонкие клиенты не просто отправляют сообщение по этому URL-адресу? Они действительно делают GET, чтобы получить форму? Преимущество форм заключается в возможности преобразования их в HTML и проверки данных. Я не думаю, что вам нужно что-то из этого здесь.
Имя хоста удаленного клиента хранится в заголовке REMOTE_HOST
запроса, поэтому вы можете использовать это, чтобы извлечь его.
def log(request):
thin_client, _ = Thinclient.get_or_create(hostname=request.META["REMOTE_HOST"])
Log(thin_client=thin_client, logname=request.POST["logname"]).save()
return HttpResponse(content="OK", mimetype="text/plain")
В качестве примечания вы всегда должны возвращать некоторый контент. Некоторым прокси не нравятся ответы с нулевым байтом. Вы также должны всегда указывать mimetype , даже если по умолчанию используется text / html .